ZOJ 1909 Square (DFS + 剪枝)
2014-03-26 22:28
309 查看
一开始TLE,加了剪枝后不断WA,一直没找出原因 = = !
暂时贴上保存了
最后参考了大牛的思路http://blog.csdn.net/xsbailong/article/details/6844603
AC代码
暂时贴上保存了
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct ss{ int val; int sum; }; ss a[22]; int tol,s,cnt; int cmp(ss a,ss b) { return a.val>b.val; } void dfs(int t,int len,int index) { if(len==s){ cnt++; len=0; index=0; } if(cnt==3)return; for(int i=index;i<tol;i++) { if(len+a[i].val<=s&&a[i].sum>0){ if(cnt==3)return; // printf("%d %d %d\n",t,a[i].val,len); a[i].sum--; dfs(t+1,len+a[i].val,i); a[i].sum++; } } } int main() { int t,i,j,n; cin>>t; while(t--) { cin>>n; for(i=0;i<n;i++){ a[i].val=-1; a[i].sum=0; } tol=0; s=0; for(i=0;i<n;i++) { int p; cin>>p; s+=p; for(j=0;j<tol;j++) { if(a[j].val==p){ a[j].sum++; break; } } if(j==tol){ a[tol].val=p; a[tol].sum=1; tol++; } } if(s%4!=0) { printf("no\n"); continue; } sort(a,a+tol,cmp); if(a[0].val>s/4){ printf("no\n"); continue; } // for(i=0;i<tol;i++)printf("***%d %d\n",a[i].val,a[i].sum); s/=4; cnt=0; dfs(0,0,0); if(cnt==3)printf("yes\n"); else printf("no\n"); } return 0; } /* 3 4 1 1 1 1 5 10 20 30 40 50 8 1 7 2 6 4 4 3 5 */
最后参考了大牛的思路http://blog.csdn.net/xsbailong/article/details/6844603
AC代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct ss{ int val; int sum; }; ss a[22]; int tol,s,cnt,f; int cmp(ss a,ss b) { return a.val>b.val; } void dfs(int rest ,int summ,int index) { if(summ==s){ f=1; return; } for(int i=index;i<tol;i++) { if(a[i].val<=rest&&a[i].sum>0){ a[i].sum--; if(a[i].val==rest) { dfs(s,summ-rest,0); } else { dfs(rest-a[i].val,summ-a[i].val,i); } a[i].sum++; if(rest==s)return; } } } int main() { int t,i,j,n,maxi; cin>>t; while(t--) { cin>>n; tol=0; s=0; maxi=-1; for(i=0;i<n;i++) { int p; cin>>p; s+=p; for(j=0;j<tol;j++) { if(a[j].val==p){ a[j].sum++; break; } } if(j==tol){ a[tol].val=p; a[tol].sum=1; tol++; if(maxi<p)maxi=p; } } if(s%4!=0||maxi>s/4) { printf("no\n"); continue; } sort(a,a+tol,cmp); // for(i=0;i<tol;i++)printf("***%d %d\n",a[i].val,a[i].sum); s/=4; f=0; dfs(s,s*4,0); if(f)printf("yes\n"); else printf("no\n"); } return 0; }
相关文章推荐
- hdu1518 Square | ZOJ1909 | POJ2362 (dfs + 剪枝)
- HDU1518 & POJ2362 & ZOJ1909 Square(DFS,剪枝是关键呀)
- hdoj 1518 Square 【dfs+剪枝】
- poj 2362 Square(dfs, 剪枝)
- DFS:HDU1518-Square(剪枝较多的DFS)
- POJ 2362 HDOJ 1518 Square DFS剪枝
- hdu 1518 Square【DFS+剪枝】
- hdu1518(DFS+剪枝 Square )
- hdoj 1518 Square (DFS + 剪枝)
- 【DFS+剪枝】Square
- HDU 1518 Square (DFS+剪枝)
- 【POJ】Square(DFS + 剪枝)
- POJ 2362 Square (DFS +剪枝)
- DFS POJ 2362 Square
- hdu 1010 走到终点时刚好花掉所有时间 (DFS + 奇偶性剪枝 )
- //深搜dfs//找到答案就一路return才不会超时//Square------三Y
- HDU 1728 逃离迷宫 单方向BFS 或者DFS加剪枝
- POJ1190 生日蛋糕(DFS剪枝)
- HDU_(1010) Tempter of the Bone(DFS,剪枝)
- 通过剪枝来避免不必要循环的dfs算法实例,2017年计蒜课模拟赛(五)第六题