uva-10344 - 23 out of 5

来源:互联网 发布:淘宝做活动怎么做 编辑:程序博客网 时间:2024/06/07 13:12

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;}









0 0
原创粉丝点击