1 条题解
-
0
C++ :
#include<bits/stdc++.h> using namespace std; const int N=70; int n; int w[N]; int sum,length; bool st[N]; bool dfs(int u,int cur,int start) { if(u*length==sum) return true; //找到答案 if(cur==length) return dfs(u+1,0,0); //新开一组 for(int i=start;i<n;i++) //2.剪枝(排除等效冗余->内部有序) { if(st[i]) continue; //当前木棒已经使用过了 if(cur+w[i]>length) continue; //3.剪枝.可行性剪枝 st[i]=true; if(dfs(u,cur+w[i],i+1)) return true; st[i]=false; if(!cur) return false; //3.剪枝 (第一根失败后面一定失败) if(cur+w[i]==length) return false;//3.剪枝 (最后一根失败后面一定失败) int j=i; while(j<n&&w[i]==w[j]) j++;//3.剪枝(排除等效冗余->当前长度一定不可以) j--; i=j; } return false; } int main() { cin>>n; for(int i=0;i<n;i++) { cin>>w[i]; sum+=w[i]; } //1.剪枝(优化搜索顺序->按照木棍顺序从大到小开始搜索) sort(w,w+n); reverse(w,w+n); length=1; while(true) { if(sum%length==0&&dfs(0,0,0)) { cout<<length<<endl; break; } length++; } return 0; }
- 1
信息
- ID
- 794
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者