WA18分在线求调
  • 板块P1120 小木棍
  • 楼主xxxalq
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/7/15 09:28
  • 上次更新2023/11/3 09:46:16
查看原帖
WA18分在线求调
322437
xxxalq楼主2023/7/15 09:28

ans记录答案,mk用来标记是否用过,cnt表示已经拼成了多少根,res表示目前这一根长度,target枚举最小长度

#include<iostream>
#include<algorithm>
using namespace std;
int n,a[70],ans=0x3f3f3f3f,maxn=0,mk[70],sum,target;
void dfs(int res,int cnt){
	if(cnt==sum/target){
		ans=min(target,ans);
		return;
	}
	for(int i=1;i<=n;i++){
		if(mk[i]==0&&res+a[i]<target){
			mk[i]=1;
			dfs(res+a[i],cnt);
			mk[i]=0;
		}
		if(mk[i]==0&&res+a[i]==target){
			mk[i]=1;
			dfs(0,cnt+1);
		}
	}
	return;
}
bool cmp(int x,int y){
	return x>y;
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i]; 
		maxn=max(maxn,a[i]);
		sum+=a[i];
	}
	sort(a+1,a+1+n,cmp);
	for(int i=maxn;i<=sum;i++){
		if(sum%i==0){
			target=i;
			dfs(0,0);
		}
	}
	cout<<ans;
	return 0;
}
2023/7/15 09:28
加载中...