大致题意是:先输入5个数,然后用‘+’,‘-’,‘*’,
连接起来,看看是否能恰好等于23,若能,输出“Possible”,
否则输出“Impossible”。用回溯+全排列就可以啦~
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<algorithm>
#include<cstring>
using namespace std;
int a[5];
int flag=0;
void dfs(int n,int ans)
{
if(n==5&&ans==23)
{
flag=1;
return;
}
if(n>=5) return;
dfs(n+1,ans+a[n]);
dfs(n+1,ans-a[n]);
dfs(n+1,ans*a[n]);
}
int main()
{
int i;
while(1)
{
for(i=0;i<5;i++)
scanf("%d",&a[i]);
if(!a[0]&&!a[1]&&!a[2]&&!a[3]&&!a[4])
break;
flag=0;
sort(a,a+5);
do{
dfs(1,a[0]);
}while(next_permutation(a,a+5));
if(flag)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}