30分求助
查看原帖
30分求助
603868
MysteriousEast楼主2022/10/27 22:19

33分求助,膜拜Orz

//
#include<bits/stdc++.h>
typedef long long LL;
typedef float F;
typedef double D;
using namespace std;
LL n;
LL sum;
LL text;
LL ans;
LL Mt;
LL s;
LL a[105];
LL b[105];
bool U[105];
bool cmp(LL a,LL b) {
	if(a>b) return true;
	return false;
}
void Input_ () {
	cin>>n;
	for(LL i=1;i<=n;i++) {cin>>a[i]; if(a[i]>50)continue; sum+=a[i];}
    return ;
}
void Print_ () {
	cout<<ans;
    return ;
}
void Dfs(LL s,LL k,LL t) {
//for(LL i=1;i<=n;i++) printf("%lld ",b[i]);
//printf("\n");
	if(k==sum/text) {ans=text;return ;}
	if(t>n) ans=-1;
	if(ans==0) {
		if(s>n) return ;
		if(a[s]<text-b[k]&&!U[s])  {
			b[k]+=a[s];
			U[s]=1;
			Dfs(s+1,k,t+1);
			b[k]-=a[s];
			U[s]=0;
		}
		if(a[s]==text-b[k]&&!U[s])  {
			b[k]+=a[s];
			U[s]=1;
			Dfs(0,k+1,t+1);
			b[k]-=a[s];
			U[s]=0;
		}
//		while(a[s]==a[s+1]) ss++;
		Dfs(s+1,k,t+1);
		if(sum-b[k]==a[s]||sum-b[k]==text) return;
	}
}
void Work_ () {
	Mt=sum*n;
	sort(a+1,a+n+1,cmp);
	for(LL i=a[1];i<=sum;i++) {
		if(sum%i!=0) continue;
		text=i;
		Dfs(0,1,0);
		if(ans==-1)ans=0;
		if(ans!=0) break;
	}
    return ;
}
int main(int argc, char* argv[]) {
    Input_();
    Work_();
    Print_();
    return 0;
}
//:-)
//针·不戳
/*
9
5 2 1 5 2 1 5 2 1

6
*/
/*

*/

2022/10/27 22:19
加载中...