标签:ref space 就是 get ++ 大于等于 problem 很多 大于
还有剪枝,如果这根小木棍等于原长却没被用上,说明这也是不合法的(这两个剪枝会剪掉4个点
#include<iostream>
#include<algorithm>
using namespace std;
inline int read(){
int s=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
int n,x,num,tag,s,len;
int a[100],book[100],net[100];
bool cmp(int a,int b){
return a>b;
}
void dfs(int now,int last,int res){
if(!res){// now 当前是第几个,last拼的上一段的编号,res剩下的长度
if(now==num) {
tag=1;
return ;
}
for(int i=1;i<=n;i++)
if(!book[i]){
book[i]=1;
dfs(now+1,i,len-a[i]);
book[i]=0;
if(tag) return ;
break;
}
}
int l=last+1,r=n,mid;
while(l<=r){
mid=(l+r)>>1;
if(a[mid]>res) l=mid+1;
else r=mid-1;
}
for(int i=l;i<=n;i++)
if(!book[i]){
book[i]=1;
dfs(now,i,res-a[i]);
book[i]=0;
if(tag) return ;
if(a[i]==res||res==len) return ;
i=net[i];
if(i==n) return ;
}
}
int main()
{
x=read();
for(int i=1;i<=x;i++){
int xx;
xx=read();
if(xx<=50) {
a[++n]=xx;
s+=xx;
}
}
sort(a+1,a+n+1,cmp);
for(int i=n;i>=1;i--)
if(a[i]==a[i+1]) net[i]=net[i+1];
else net[i]=i;
for(len=a[1];len<=s/2;len++){
if(s%len) continue;
num=s/len;
book[1]=1;
tag=0;
dfs(1,1,len-a[1]);
book[1]=0;
if(tag){printf("%d",len);return 0;}
}
printf("%d",s);
return 0;
}
标签:ref space 就是 get ++ 大于等于 problem 很多 大于
原文地址:https://www.cnblogs.com/Vimin/p/11508254.html