27分求助
  • 板块P1120 小木棍
  • 楼主covonant
  • 当前回复0
  • 已保存回复0
  • 发布时间2025/1/19 20:41
  • 上次更新2025/1/20 08:42:38
查看原帖
27分求助
728840
covonant楼主2025/1/19 20:41
#include<bits/stdc++.h>
using namespace std;
int n,maxx,sum;
int a[105];
int pre[105],nxt[105];
bool dfs(int x,int i,int j,int k,int w){
	//x: a数组中的idx i:已经拼好几根 j:正在拼的这根已经拼了多少 k:目标长度	
	if(i==w+1) return 1;
	if(j==k) return dfs(1,i+1,0,k,w);	
	if(x==n+1) return 0;
	if(a[x]+j<=k){
		//能拼 
		pre[nxt[x]]=nxt[x];
		nxt[pre[x]]=pre[x];
		bool ans=dfs(nxt[x],i,a[x]+j,k,w);
		pre[nxt[x]]=x;
		nxt[pre[x]]=x;
		if(ans) return 1;
		if(a[x]+j==k) return 0;
	} 
	return dfs(x+1,i,j,k,w);
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxx=max(maxx,a[i]);
		sum+=a[i];
	}
	sort(a+1,a+1+n,greater<int>());
	for(int i=1;i<n;i++){
		nxt[i]=i+1;
	}
	for(int i=2;i<=n;i++){
		pre[i]=i-1;
	}
	for(int i=maxx;i<=sum;i++){
		if(sum%i!=0) continue;
		if(dfs(1,1,0,i,sum/i)){
			cout<<i;
			return 0;
		}
	}
	return 0;
}
2025/1/19 20:41
加载中...