45求助
  • 板块P1120 小木棍
  • 楼主Chenww
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/11/7 13:45
  • 上次更新2023/10/27 03:57:01
查看原帖
45求助
591192
Chenww楼主2022/11/7 13:45

代码如下

#include<iostream>
#include<algorithm>
#include<string.h>
using namespace std;
int a[70],v[70],val,n,sum,cnt,len;

/*stick表示拼到第stick根木棍
cab表示当前木棍长度
last表示拼接的上一根木棍*/ 
bool dfs(int stick,int cab,int last){
	if(stick > cnt) return true;//拼完所有木棍 
	if(cab == len){
		//printf("cnt:%dstick:%d,len:%d\n",cnt,stick,cab);
		return dfs(stick+1,0,1);//当前木棍已拼完
	}
	int fail = 0;
	for(int i = last;i <= n; i++)
		if(!v[i] && cab + a[i] <= len && fail != a[i]){
			v[i] = 1;
			if(dfs(stick , cab+a[i],i+1)) return true;
			fail = a[i];
			if(cab == 0 && cab + a[i] == len) return false;
		}
	return false;
}
int main(){
	cin>>n;
	for(int i = 1;i <= n; i++){
		cin>>a[i];
		sum += a[i],val = max(val,a[i]);
	}
	sort(a + 1,a+n+1);
	reverse(a+1,a+n+1);\
	//printf("sum:%d\n",sum); 
	for(len = val;len <= sum; len++){
		if(sum % len) continue;
		memset(v,0,sizeof(v));
		cnt = sum / len;
		if(dfs(1,0,1)) break;
	}
	printf("%d",len);
	return 0; 
} 
2022/11/7 13:45
加载中...