栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

试题 算法训练 粘木棍 c++

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

试题 算法训练 粘木棍 c++

#include
using namespace std;
int a[11],b[11],f[9999],n,m;
int diff=0x7fffffff;
void dfs(int depth){
	if(depth>n){
		int s1=b[1],s2=b[1];
		for(int i=1;i<=m;i++){
			s1=max(s1,b[i]);//选出m个组中 最大的和最小的 
			s2=min(s2,b[i]);
		}
		diff=min(diff,s1-s2);
		return ;
	}
	//思想是这样的
	// 第一个for循环 代表的是第几根木棍 因为n个木棍要分m组 故在n根木棍中
	//每根木棍都有m种选择 m∈(1...m) 即当i==1时 m==1是一种情况    i==1时m==2又是一种情况 ..... 
	//每一根木棍 都是属于(1~m)组的 
	for(int i=depth;i<=n;i++)
	//从depth个元素开始枚举 从depth开始是因为每次递归深度加一 因为上次递归已经把
	//第u-1木棍给用了 
	//第二个for循环 这根木棍该放在第几个组别 放完组别后然后继续往深度走 
	for(int j=1;j<=m;j++){
		if(!f[a[i]]){
			b[j]+=a[i];
			f[a[i]]=1;
			dfs(depth+1);
			b[j]-=a[i];//回溯  也就是说 上次递归给他的木棒再给他拿回去分给j+1组 
			f[a[i]]=0;
		}
	}
	return ;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	dfs(1);
	cout< 

在网上借鉴了几位大佬的解法以及解释才看懂的

在这上面记录一下 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/738601.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号