标签:
Description
Input
Output
Sample Input
9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0
Sample Output
6 5
题目大意:
任意分割木棒,分割后想把这些碎木棒还原到原来状态,可是他忘记了原先有多少木棒以及那些木棒原来有多长。请计算原先木棒的最小可能长度。
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int n,num[69]; int pd[69]; int cmp(int a,int b) { return a>b; } int dfs(int len,int s,int nu) { int i; if(s==0&&nu==0)//假设剩下的长度和剩下的木棒数为0。则成功 return len; if(s==0)//假设剩下的长度为0,则又一次赋值 s=len; for(i=0;i<n;i++) { if(pd[i]==1) continue; if(s>=num[i]) { pd[i]=1; if(dfs(len,s-num[i],nu-1)) return len; pd[i]=0;//假设不成功,则当前棒不使用 if(num[i]==s||s==len) break; while(num[i]==num[i+1]) i++; } } return 0; } int main() { while(cin>>n&&n) { int i; int sum; sum=0; int len,k; for(i=0;i<n;i++) { cin>>num[i]; sum=sum+num[i]; } sort(num,num+n,cmp); for(len=num[0];len<=sum;len++) { memset(pd,0,sizeof(pd)); if(sum%len==0) { k=dfs(len,0,n); if(k) break; } } cout<<k<<endl; } return 0; } /* 9 5 2 1 5 2 1 5 2 1 4 1 2 3 4 0 */
标签:
原文地址:http://www.cnblogs.com/mengfanrong/p/5015017.html