标签:
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