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
先枚举5个数的排列顺序,再搜索4个符号的状态+-*。
#include <iostream>
#include <algorithm>
using namespace std;
int num[5];
int pos[5]; //保存5个数的排列顺序
int search(int cur, int value)
{
if(cur == 5){
return value == 23 ? 1 : 0;
}
if(search(cur+1, value*num[pos[cur]])) return 1;
if(search(cur+1, value+num[pos[cur]])) return 1;
return search(cur+1, value-num[pos[cur]]);
}
int main()
{
while(1){
int ans, sum = 0;
for(int i = 0; i < 5; i++){
cin >> num[i];
sum += num[i];
pos[i] = i;
}
if(!sum) break; //全都为0跳出 循环
do{
ans = search(1, num[pos[0]]);
if(ans) break;
}while(next_permutation(pos, pos+5));
if(ans) cout << "Possible\n";
else cout << "Impossible\n";
}
return 0;
}