就是枚举+ 全排列
一开始写复杂了,只要每次传进去写三次+-* 就行了
题目:
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
代码:
1 #include <iostream> 2 #include <algorithm> 3 using namespace std; 4 5 char opera[]={'*','+','-'}; 6 int arr[6]; 7 bool flag=false; 8 void dfs(int v,int cur,int u) 9 { 10 if(cur>5) 11 { 12 if(v==23 && !flag) 13 { 14 flag=true; 15 cout<<"Possible"<<endl; 16 } 17 return ; 18 } 19 20 dfs(v+arr[u],cur+1,u+1); 21 dfs(v-arr[u],cur+1,u+1); 22 dfs(v*arr[u],cur+1,u+1); 23 24 } 25 26 27 int main() 28 { 29 while(1) 30 { 31 for(int i=0;i<5;i++) 32 { 33 cin>>arr[i]; 34 } 35 if(arr[0]==0 && arr[1]==0&&arr[2]==0&&arr[3]==0&&arr[4]==0) 36 { 37 break; 38 } 39 sort(arr,arr+5); 40 do 41 { 42 dfs(arr[0],1,1); 43 44 if(flag)break; 45 }while(next_permutation(arr,arr+5)); 46 if(!flag ) 47 cout<<"Impossible"<<endl; 48 49 flag=false; 50 } 51 52 return 0; 53 }