小木棍
内存限制:512 MiB
时间限制:1000 ms
标准输入输出
题目类型:传统
评测方式:文本比较
题目描述
乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50。现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度。给出每段小木棍的长度,编程帮他找出原始木棍的最小可能长度。
输入格式
第一行为一个单独的整数 表示砍过以后的小木棍的总数。 第二行为 个用空格隔开的正整数,表示 根小木棍的长度。
输出格式
输出仅一行,表示要求的原始木棍的最小可能长度。
样例
样例输入
9
5 2 1 5 2 1 5 2 1
样例输出
6
#include<bits/stdc++.h>
using namespace std;
const int M_AX=1e6+7;
int n,a[M_AX],ans,cnt,len;
bool vis[M_AX];
bool dfs(int stick,int cab,int last){
if(stick>cnt)return true;
if(cab==len)return dfs(stick+1,0,1);
int fail=0;
for(int i=last;i<=n;i++){
if(!vis[i]&&cab+a[i]<=len&&fail!=a[i]){
vis[i]=true;
if(dfs(stick,cab+a[i],i+1))return true;
vis[i]=false;
fail=a[i];
if(cab==0||cab+a[i]==len)return false;
}
}
return false;
}
bool cmp(int x,int y){return x>y;}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
ans+=a[i];
}
sort(a+1,a+1+n,cmp);
for(int i=a[1];i<=ans-1;i++){
if(ans%i!=0)continue;
cnt=ans/i,len=i;
if(dfs(1,0,1)){
cout<<i;
exit(0);
}
}
cout<<ans;
return 0;
}