题目链接: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\n",aim);break;}}}}return 0; }