标准递归版本,参照《程序设计在线》: #include<stdio.h> #include<string.h> #include<stdlib.h> int a[70],used[70]; int n,maxlen,sumlen,k; int yuanlen,num,flag; int cmp(const void *a,const void *b) { return *(int *)b-*(int *)a; } bool dfs(int unused,int left,int len) { int i; if(unused==0&&left==0)//所有木棍已用光,并且剩余长度为零 return true; if(left==0) left=len;//重新赋值 for(i=0;i<n;i++) { if(used[i]==1)continue;//已用过,跳过 if(a[i]>left) continue;//大于所需,跳过 used[i]=1; if(dfs(unused-1,left-a[i],len)) return true;//尝试a[i],看是否能成功 used[i]=0; if(a[i]==left||left==len)//如果当前尝试的是某个原始木棍中的第一个位置或最后位置,并且导致失败,不必再这个位置上尝试余下的木棍了 break; } return false; } int main() { int i; while(scanf("%d",&n)!=EOF) { if(n==0) break; sumlen=0; for(i=0;i<n;i++) { scanf("%d",&a[i]); sumlen+=a[i]; } qsort(a,n,sizeof(int),cmp); maxlen=a[0]; int len=a[0]; for(k=maxlen;k<=sumlen;k++) { memset(used,0,sizeof(used)); if(sumlen%k!=0)continue; if(dfs(n,0,k)) { printf("%d/n",k); break; } } } }