小木棍

内存限制: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;
} 
posted @ 2021-03-02 21:31  黄逸飞重庆八中  阅读(71)  评论(0编辑  收藏  举报