百练2787 nyist 43 算24

来源:互联网 发布:女生宿舍关系 知乎 编辑:程序博客网 时间:2024/05/22 14:56

思路:每次枚举两个数,一个运算符,得到一个运算结果。在重复执行,直到只剩下一个数即可。

 

nyist 43:http://acm.nyist.net/JudgeOnline/problem.php?pid=43

#include <iostream>#include <cmath>using namespace std;/*求存于a数组中n个数(可以是实数,整数,负数,零),能否通过+-/*四个运算得到结果sum,每个数只能用一次,运算符可以多次使用 .若能ans=1; 不能ans=0 */ int ans=0;void dfs(double a[],int n,int sum){int i,j,x,y,k,m;double b[10];if(n==1&&fabs(a[0]-sum)<1e-6) 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,sum);b[m]=a[i]-a[j];  dfs(b,m+1,sum);b[m]=a[i]*a[j];  dfs(b,m+1,sum);if(a[j]!=0)b[m]=a[i]/a[j];  dfs(b,m+1,sum);}}}int main(int argc, char *argv[]){double a[10]; int t,n,i,sum;cin>>t;while(t--){cin>>n>>sum;for(i=0;i<n;i++) cin>>a[i];ans=0; dfs(a,n,sum); if(ans) cout<<"Yes"<<endl;else cout<<"No"<<endl;}return 0;}


百练2787:http://poj.grids.cn/practice/2787/

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


 

原创粉丝点击