题目链接:http://poj.org/problem?id=1011
解题报告:
#include <cstdio> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int maxn =70; int n,sum,aim,num,a[maxn]; bool used[maxn]; bool cmp(int a,int b) { return a>b; } bool dfs(int Stick,int len,int pos) { ///Stick表示当前组合好的棍子数,len表示已经有的长度,pos表示搜索到了第几根 int i; bool sign=(len==0?true:false); if(Stick==num) return true; for(i=pos+1;i<n;i++) { if(used[i]) continue; if(len+a[i]==aim) { used[i]=true; if(dfs(Stick+1,0,-1)) return true; used[i]=false; return false; } else if(len+a[i]<aim) { used[i]=true; if(dfs(Stick,len+a[i],i)) return true; used[i]=false; if(sign) return false; while(a[i]==a[i+1]) i++; } } return false; } int main() { while(scanf("%d",&n),n) { sum=0; for(int i=0;i<n;i++) { scanf("%d",&a[i]); sum+=a[i]; } sort(a,a+n,cmp); for(aim=a[0];aim<=sum;aim++) { if(sum%aim==0) { num=sum/aim; memset(used,false,sizeof(used)); if(dfs(1,0,-1)) { printf("%d ",aim); break; } } } } return 0; }