87分,最后一点超时,大佬帮忙看下
  • 板块P1120 小木棍
  • 楼主bosado
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/4/6 21:14
  • 上次更新2023/10/28 04:25:15
查看原帖
87分,最后一点超时,大佬帮忙看下
660732
bosado楼主2022/4/6 21:14
#include<bits/stdc++.h>
using namespace std;
#define maxn 1005
int n,a[maxn],vis[maxn],cnt,len;
bool dfs(int stick,int cab,int last){
	if(stick>=cnt)return true;
	if(cab==len)return dfs(stick+1,0,1);
	int fail=0;
	for(int i=last;i<=n;i++){
		if(!vis[i]&&cab+a[i]<=len&&fail!=a[i]){
			vis[i]=1;
			if(dfs(stick,cab+a[i],i+1))return true;
			fail=a[i];
			vis[i]=0;
			if(cab==0||cab+a[i]==len)return false;
		}
	}
	return false; 
}
int main (){
	cin>>n;
	int sum=0,val=0;
	for(int i=1;i<=n;i++)cin>>a[i],sum+=a[i],val=max(a[i],val);
	sort(a+1,a+1+n);
	reverse(a+1,a+1+n);
	for( len=val;len<=sum;len++){
		if(sum%len)continue;
		cnt=sum/len;
		memset(vis,0,sizeof(vis));
		if(dfs(1,0,1))break;
	}
	cout<<len<<endl;
	return 0;
}
2022/4/6 21:14
加载中...