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
=============================
五个数字都用完的时候返回
要注意第一个数字不是固定的,要从五个数中选一个出来
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int ok,a[11];
bool vis[11];
void dfs(int cur,int ans)
{
if(cur==5)
{
if(ans==23)
ok=1;
return;
}
for(int i=0;i<5;i++)
{
if(!vis[i])
{
vis[i]=1;
dfs(cur+1,ans+a[i]);
dfs(cur+1,ans-a[i]);
dfs(cur+1,ans*a[i]);
vis[i]=0;
}
if(ok) return;
}
}
int main()
{
while(~scanf("%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4]))
{
if(a[0]==0&&a[1]==0&&a[2]==0&&a[3]==0&&a[4]==0) break;
ok=0;
for(int i=0;i<5;i++)
{
memset(vis,0,sizeof(vis));
vis[i]=1;
dfs(1,a[i]);
}
if(ok) printf("Possible\n");
else printf("Impossible\n");
}
return 0;
}