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

算法

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

算法

多重背包_二进制优化 第一步:拆分
//二进制拆分
int num=1;//计数
int vv[10001],ww[10001];
for(int i=1;i<=n;i++){
	cin>>v>>w>>s;//体积 价值  数量
	for(int j=1;j<=s;j<<=1){
		vv[num]=v*j;
		ww[num++]=w*j;
		s-=j;
	}
	//如果还有剩下 剩下的部分为一个 个体
	if(s){
		vv[num]=s*v;
		ww[num++]w*s;
	}
}
输入:
3 7
2 3 12
3 5 15
1 2 3

拆分结果

输出:
10 7
1:2 3
2:4 6
4:8 12
5:10 15
1:3 5
2:6 10
4:12 20
8:24 40
1:1 2
2:2 4
第二步

通过 01背包问题求解

for(i =1;i=vv[i];j--){
		dp[j]=max(dp[j],dp[j-vv[i]]+ww[i])
		}
	}
cout< 
最终调试代码: 
#include
using namespace std;

int main(){
	//二进制拆分
	int dp[10001];
	int n,m;
	int v,w,s;
	cin>>n>>m; 
	int num=1;//计数
	int vv[10001],ww[10001];
	for(int i=1;i<=n;i++){
		cin>>v>>w>>s;//体积 价值  数量
		for(int j=1;j<=s;j<<=1){
			vv[num]=v*j;
			ww[num++]=w*j;
			s-=j;
		}
		//如果还有剩下 剩下的部分为一个 个体
		if(s){
			vv[num]=s*v;
			ww[num++]=w*s;
		}
	}
	//01背包 
	for(int i =1;i=vv[i];j--){
			dp[j]=max(dp[j],dp[j-vv[i]]+ww[i]);
		}
	}
	cout< 

运行结果:

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

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

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