回溯,但是效率还是不高,学习 #include<stdio.h> #include<string.h> #include<time.h> #define LOCAL int ok; int a[5],flag[5]; long num; void solve(int k) { int i; if(ok) return; if(k==4) { if(num==23) ok=1; return; } else { for(i=0;i<5;i++) if(flag[i]==0)/分支的感觉 { flag[i]=1; num+=a[i]; solve(k+1); num-=a[i]; num-=a[i]; solve(k+1); num+=a[i]; num*=a[i]; solve(k+1); num/=a[i]; flag[i]=0; } } } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out1.txt","w",stdout); #endif int i; while(1) { int t=0; ok=0; for(i=0;i<5;i++) { scanf("%d",&a[i]); if(a[i]!=0) t=1; } if(!t) break; memset(flag,0,sizeof(flag)); for(i=0;i<5;i++) { num=a[i]; flag[i]=1; solve(0); flag[i]=0; if(ok) break; } if(ok) printf("Possible/n"); else printf("Impossible/n"); } printf("%f/n",(double)clock()/CLOCKS_PER_SEC); return 0; } ///这个效率就更差了 /*#include<stdio.h> #include<string.h> #include<time.h> #define LOCAL int ok; int a[5],flag[5],res_num[5],p,q; char op[3]={'+','-','*'},res_op[4]; int calc() { long num=res_num[0]; int i; for(i=0;i<4;i++) { switch(res_op[i]) { case '+': num+=res_num[i+1]; break; case '-': num-=res_num[i+1]; break; case '*': num*=res_num[i+1]; break; } } return num; } void solve(int k) { int i; if(k>8) { if(calc()==23) ok=1; return; } if(ok) return; if(k%2==0) { for(i=0;i<5;i++) { if(!flag[i]) { flag[i]=1; res_num[p++]=a[i]; solve(k+1); flag[i]=0; p--; } } } else for(i=0;i<3;i++) { res_op[q++]=op[i]; solve(k+1); q--; } } int main() { #ifdef LOCAL freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif int i,j; while(1) { int t=0; ok=0;p=0;q=0; for(i=0;i<5;i++) { scanf("%d",&a[i]); if(!t) break; memset(flag,0,sizeof(flag)); solve(0); if(ok) printf("Possible/n"); else printf("Impossible/n"); } printf("%f/n",(double)clock()/CLOCKS_PER_SEC); return 0; }*/