组合树枝成最短长。回溯大家都知道,复杂的是直接提交一定TLE,要剪枝。。。
笔者没有深入的思考,在网上找了一篇说的比较好的,分享下:http://blog.sina.com.cn/s/blog_520db5ec0100copn.html
笔者的代码如下:
#include <iostream> #include <algorithm> using namespace std; int n,s[99],v[99],sum,t,num,m; bool DFS(int x,int y) { int i; if(y==num) return true; for(i=0;i<n;i++) if(!v[i]) if(s[i]+x==t) { v[i]=1; if(DFS(0,y+1)) return true; v[i]=0; return false; } else if(s[i]+x<t) { v[i]=1; if(DFS(s[i]+x,y)) return true; v[i]=0; if(x==0) return false; while(s[i]==s[i+1]) i++; } return false; } bool cmp(int a,int b) { return a>b; } int main() { int i; while(cin>>n&&n) { memset(v,0,sizeof(v)); for(sum=m=i=0;i<n;i++) { cin>>s[i]; sum+=s[i]; } sort(s,s+n,cmp); for(i=s[0];i<sum;i++) if(sum%i==0) { t=i; num=sum/i; if(DFS(0,0)) break; } cout<<i<<endl; } }