标签:超过 增加 ref names visit printf href 原来 题意
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<queue>
#include<map>
#include<set>
#define ll long long
using namespace std;
inline int read(){
int x=0,o=1;char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9'))ch=getchar();
if(ch=='-')o=-1,ch=getchar();
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*o;
}
const int N=105;
int n,tot,val,sum,len;
int a[N],visit[N];
//当前正在拼第now跟木棒
//第now跟木棒已经拼出了长度cnt
//当前已经考虑到了第last根木棍
inline bool dfs(int now,int cnt,int last){
if(now>sum)return true;//sum根木棒都拼完了
if(cnt==len)return dfs(now+1,0,1);//当前这根拼完了
int fail=0;//剪枝五用的
for(int i=last;i<=n;++i){
if(!visit[i]&&cnt+a[i]<=len&&fail!=a[i]){
visit[i]=1;
if(dfs(now,cnt+a[i],i+1))return true;
fail=a[i];//记录不要填与a[i]相同长度的木棍了
visit[i]=0;//回溯
if(!cnt||cnt+a[i]==len)return false;//剪枝三,四
}
}
return false;
}
int main(){
int nn=read();
for(int i=1;i<=nn;++i){
int b=read();
if(b<=50){//过滤不合法的木棍
a[++n]=b;tot+=b;//记录长度和
val=max(b,val);//比较最长木棍
}
}
sort(a+1,a+n+1);reverse(a+1,a+n+1);//从大到小排序
for(len=val;len<=tot;++len){//枚举原始木棍长度为len
if(tot%len)continue;//不能整除肯定不合法
sum=tot/len;//要拼凑出sum根木棍
memset(visit,0,sizeof(visit));//初始化
if(dfs(1,0,1)){
printf("%d\n",len);
break;
}
}
return 0;
}
标签:超过 增加 ref names visit printf href 原来 题意
原文地址:https://www.cnblogs.com/PPXppx/p/11385261.html