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;
}
本文详细介绍了如何使用递归和排列组合的方法解决数学问题,即从五个给定的正整数中找出一个算术表达式,使其结果为23。通过枚举数的排列顺序和符号状态,实现对所有可能组合的搜索,从而判断是否存在符合条件的表达式。
472

被折叠的 条评论
为什么被折叠?



