78分,求救!急!
查看原帖
78分,求救!急!
928342
26946z2111楼主2023/10/17 21:51
#include<bits/stdc++.h>
using namespace std;
int n,a[110],len,sm,nxt[110];
bool flag[110],Flag;
void dfs(int k,int lst,int ln){
	if(Flag)return;
	if(ln==0){
		if(k==sm){
			Flag=1;
			return;
		}
		int q;
		for(int i=1;i<=n;i++){
			if(!flag[i]){
				q=i;
				break;
			}
		}
		flag[q]=1;
		dfs(k+1,q,len-a[q]);
		flag[q]=0;
		return;
	}
	int l=lst+1,r=n;
    while(l<r){
        int mid=(l+r)>>1;
        if(a[mid]<=ln)r=mid;
        else l=mid+1;
    }
	for(int i=l;i<=n;i++){
		if(!flag[i]&&ln-a[i]>=0){
			flag[i]=1;
			dfs(k,i,ln-a[i]);
			flag[i]=0;
			if(Flag)return;
			if(a[i]==lst||len==lst)return;
			i=nxt[i];
		}
	}
}
bool cmp(int x,int y){return x>y;}
int main(){
//	freopen("stick.in","r",stdin);
//	freopen("stick.out","w",stdout);
	cin>>n;
	int sum=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		sum+=a[i];
	}
	sort(a+1,a+n+1,cmp);
	for(int i=n;i>=1;--i){
		if(a[i]!=a[i+1]){
			nxt[i]=i;
		}
		else nxt[i]=nxt[i+1];
	}
	for(len=a[1];len<=sum;len++){
		if((len>sum/2&&len<sum)||sum%len!=0)continue;
		sm=sum/len;
		flag[1]=1;
		dfs(1,1,len-a[1]);
		flag[1]=0;
		if(Flag){
			cout<<len;
			break;
		}
	}
	return 0;
}
2023/10/17 21:51
加载中...