记录编号 306848 评测结果 AAAAAAAAAA
题目名称 [POJ 1011] 木棍拼接 最终得分 100
用户昵称 GravatarRapiz 是否通过 通过
代码语言 C++ 运行时间 0.018 s
提交时间 2016-09-13 13:17:10 内存使用 0.29 MiB
显示代码纯文本
#include<cstdio>
#include<algorithm>
#include<functional>
using namespace std;
const int MAXN=70;
int n,a[MAXN],sum,tar,tcnt;
bool pkd[MAXN];
inline bool dfs(int now,int len,int cnt){
	if(cnt==tcnt) return true;
	if(len+sum-cnt*tar<tar) return false;
	int last=0;
	for(int i=now+1;i<=n;i++) if(!pkd[i]&&a[i]+len<=tar&&a[last]!=a[i]){
		bool f=0;
		pkd[i]=1;
		if(a[i]+len==tar) {
			f=dfs(0,0,cnt+1);
		}
		else f=dfs(i,len+a[i],cnt);
		pkd[i]=0;
		//f=f||dfs(i,len,cnt);
		if(f) return true;
		if(a[i]+len==tar||len==0) break;
		last=i;
	}
	return false;
}
int main(){
	freopen("sticka.in","r",stdin);
	freopen("sticka.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++) {
		scanf("%d",&a[i]);
		if(a[i]>50) {i--,n--;continue;}
		sum+=a[i];
	}
	sort(a+1,a+1+n,greater<int>());
	int i;
	for(i=a[1];i<=sum;i++)
		if(!(sum%i)) {
			tar=i,tcnt=sum/tar;
			if(dfs(0,0,0)) {
				printf("%d ",i);
				return 0;
			}
		}
}