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
题目大意:给出5个数,任意+,-,*三中运算,没有优先级,如果表达式可能等于23,输出possible,否则输出impossible.
解题思路:DFS。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
#define N 5
#define order 23
#define MAX 10
int num[MAX];
int ok;
int bo;
void dfs(int x, int sum)
{
if ( sum == order && x == 5)
{
ok = 1;
return ;
}
else if (x >= 5)
return;
dfs(x + 1, sum + num[x]);
dfs(x + 1, sum - num[x]);
dfs(x + 1, sum * num[x]);
}
int main()
{
while (1)
{
// Init.
memset(num, 0, sizeof(num));
bo = 1;
ok = 0;
// Read.
for (int i = 0; i < N; i++)
{
scanf("%d", &num[i]);
if (num[i])
bo = 0;
}
if (bo)
break;
sort(num, num + N);
do{
dfs(1, num[0]);
}while(next_permutation(num, num + N));
if (ok)
printf("Possible\n");
else
printf("Impossible\n");
}
return 0;
}