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;
}