[回溯]23 out of 5 UVA 10344

来源:互联网 发布:windows10下安装mysql 编辑:程序博客网 时间:2024/05/18 01:20

Problem I

23 Out of 5

Input: standard input

Output: standard output

Time Limit: 1 second

Memory Limit: 32 MB

Your task is to write a program that can decide whether you can find an arithmetic expression consisting of five given numbers (1<=i<=5) that will yield the value 23.
For this problem we will only consider arithmetic expressions of the following from:

 
where : {1,2,3,4,5} -> {1,2,3,4,5} is a bijective function
and  {+,-,*} (1<=i<=4)

Input

The Input consists of 5-Tupels of positive Integers, each between 1 and 50.
Input is terminated by a line containing five zero's. This line should not be processed.

Output

For each 5-Tupel print "Possible" (without quotes) if their exists an arithmetic expression (as described above) that yields 23. Otherwise print "Impossible".

Sample Input

1 1 1 1 1
1 2 3 4 5
2 3 5 7 11
0 0 0 0 0

Sample Output

Impossible
Possible
Possible

Thomas Strohmann

搞了半天,看错题目了,以为数字的顺序不能变。。。顺序是可以变化的。

#include<iostream>#include<cstring>using namespace std;int arry[10],vis[10];int tag,s,s1;void dfs(int pos,int s){    if(pos==5&&s==23)    {        tag=1;        return;    }    for(int i=0;i<5;i++)    {        if(!vis[i])        {            vis[i]=1;            dfs(pos+1,s+arry[i]);            dfs(pos+1,s-arry[i]);            dfs(pos+1,s*arry[i]);            vis[i]=0;        }    }}int main(){    while(cin>>arry[0]>>arry[1]>>arry[2]>>arry[3]>>arry[4])    {        if(arry[0]==0&&arry[1]==0&&arry[2]==0&&arry[3]==0&&arry[4]==0) break;        tag=0;        int i,j,k;        for(i=0;i<5;i++)        {            memset(vis,0,sizeof(vis));            vis[i]=1;            dfs(1,arry[i]);        }        if(tag) cout<<"Possible"<<endl;        else cout<<"Impossible"<<endl;    }    return 0;}


原创粉丝点击