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
算23点。开始递归的时候每次都穷举一个数一个符号,然后当前这个数与之前的数的符号结合再运算,把自己搞晕了.....
直接穷举第一位,然后下次穷举出的数和符号就可以直接运算再回溯,5!*3^4规模
#include<stdio.h> #include<string.h> int f,visit[10],a[10],b[10]; int sort(int n,int num) {int i; if ((n==5)&&(num==23)) f=1; if ((n>=5)||(f)) return 0; for (i=1;i<=5;i++) if (visit[i]==0) {visit[i]=1; sort(n+1,num+a[i]); sort(n+1,num-a[i]); sort(n+1,num*a[i]); visit[i]=0; } } int main() {int i; while (scanf("%d",&a[1])) { for (i=2;i<=5;i++) scanf("%d",&a[i]); if ((a[1]==0)&&(a[2]==0)&&(a[3]==0)&&(a[4]==0)&&(a[5]==0)) break; memset(visit,0,sizeof(visit)); memset(b,0,sizeof(b)); f=0; for (i=1;i<=5;i++) {visit[i]=1; sort(1,a[i]); visit[i]=0; } if (f) printf("Possible\n"); else printf("Impossible\n"); } return 0; }