67分求助,
  • 板块P1120 小木棍
  • 楼主ZY_jiang
  • 当前回复10
  • 已保存回复10
  • 发布时间2023/7/21 14:55
  • 上次更新2023/11/3 08:26:22
查看原帖
67分求助,
796667
ZY_jiang楼主2023/7/21 14:55
#include<bits/stdc++.h>
using namespace std;
int a[65],used[65],n,len,m,minn=0,sum=0,bj;
bool cmp(const int &a,const int &b){
	return a>b;
}
void Read(){
	int i;
	cin>>n;
	for(i=1;i<=n;++i){
		cin>>a[i];
		minn=max(minn,a[i]);
		sum+=a[i];
	}
	sort(a+1,a+n+1,cmp);
}
void dfs(int k,int last,int rest){
	int i,j;
	if(k==m){
		bj=1;
		return ;
	}	
	if(rest==0){
		for(i=1;i<=n;++i){
			if(!used[i]){
				used[i]=1;
				break;
			}
		}
		dfs(k+1,i,len-a[i]);
	}
	for(i=last+1;i<=n;++i){
		if(!used[i]&&rest>=a[i]){
			used[i]=1;
			dfs(k,i,rest-a[i]);
			used[i]=0;
			j=i;
			while(i<n&&a[i]==a[j]){
				++i;
			}
			if(i==n) return ;
		}
	}
}
void solve(){
	int i,j;
	for(i=minn;i<=sum;++i){
		if(sum%i==0){
			memset(used,0,sizeof used);
			len=i;
			used[1]=1;
			bj=0;
			m=sum/i;
			dfs(1,1,len-a[1]);
			if(bj){
				cout<<len<<endl;
				break;
			}
		}
	}
}
int main(){
	Read();
	solve();
	return 0;
}
2023/7/21 14:55
加载中...