poj2787 算24
每次枚举两个数,一个运算符,得到一个运算结果。在重复执行,直到只剩下一个数即可。
#include <iostream> #include <cmath> using namespace std; int ans=0; void dfs(double a[],int n) { int i,j,x,y,k,m;double b[4]; if(n==1&&a[0]>0&&fabs(a[0]-24)<0.0001) ans=1; else if(n>1) for(i=0;i<n;i++) { for(j=0;j<n;j++) { if(i==j) continue; for(m=k=0;k<n;k++) if(k!=i&&k!=j) { b[m]=a[k]; m++;} b[m]=a[i]+a[j]; dfs(b,m+1); b[m]=a[i]-a[j]; dfs(b,m+1); b[m]=a[i]*a[j]; dfs(b,m+1); if(a[j]!=0)b[m]=a[i]/a[j]; dfs(b,m+1); } } } int main(int argc, char *argv[]) { double a[4]; //freopen("24.txt","w",stdout); while(cin>>a[0]>>a[1]>>a[2]>>a[3]&&(a[0]+a[1]+a[2]+a[3])!=0) { ans=0; dfs(a,4); if(ans) cout<<"YES"<<endl; else cout<<"NO"<<endl; } return 0; }