小木棍

xiaoxiao2021-02-28  57

爆搜,我觉得我的应该更优,可不行,不知为什么,就看了题解 加了剪枝 1.如果不行,比他大的也不行。 2.如果第一个不行剩下的都不行 3.相同的不行

#include<cstdio> #include<queue> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; int cmp(const int a,const int b) { return a>b; } int n,s,x[1999],vis[1999],maxn,ans,i,tot; int dfs(int w,int q,int p){ if(p==tot) { return 1; } if(w==0) { if(dfs(i,1,p+1)) return 1; ; } for(int j=q;j<=n;j++) { if(!vis[j]&&x[j]<=w) { vis[j]=1; if(dfs(w-x[j],j+1,p))return 1; vis[j]=0; if(w==x[j]||w==i) break; while(x[j+1]==x[j])j++; } } return 0; } int main() { scanf("%d",&n); for(int j=1;j<=n;j++) { scanf("%d",&x[j]); if(x[j]<=50) { maxn=max(maxn,x[j]); s+=x[j]; } else n--,j--; } sort(x+1,x+n+1,cmp); for(i=maxn;i<=s;i++) if(s%i==0) { tot=s/i; if(dfs(i,1,0)) { printf("%d",i); return 0; } } }
转载请注明原文地址: https://www.6miu.com/read-75142.html

最新回复(0)