01背包动态规划代码实现改进(具有通用性)

01背包的详细思路和解法来自

【动态规划】01背包问题(通俗易懂,超基础讲解)_Yngz_Miao的博客-CSDN博客_动态规划解决01背包问题本文章只是讲他的代码进行了修改,使代码只需要修改一些关键的数值也可以运行

代码部分如下,只需要修改下方的关键数值即可运行,已有两个例子。

#include<iostream>
#include <algorithm>	
using namespace std;

//int weights[6] = { 0 , 12 , 7 , 11 , 8 , 9 };			//商品的体积
//int values[6] = { 0 , 24, 13 ,23 , 15, 16 };			//商品的价值
//int bagCap = 26;									 //背包大小
//int dp[6][27] = { { 0 } };			        //动态规划表
//int items[6];					        //最优解情况的记录
//int packageNum = 5;

int bagCap = 165;
int weights[11] = { 0,23,31,29,44,53,38,63,85,89,82 };
int values[11] = { 0,92,57,49,68,60,43,67,84,87,72 };
int dp[11][167] = { {0} };
int items[11];
int packageNum = 10;

void fillDp() {					//动态规划
	for (int i = 1; i <= packageNum; i++) {		//一个背包一个背包的循环
		for (int j = 1; j <= bagCap; j++) {		//每个背包都需要根据容量来填表
			if (j < weights[i])			//如果容量小于则直接拿前面的表填后面的表
				dp[i][j] = dp[i - 1][j];	
			else
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]);	//动态规划的精髓
		}
	}
}

void fillItems(int i, int j) {				//最优解情况,i是物体总数,j是背包容量
	if (i >= 0) {	//递归判断终止的条件
		if (dp[i][j] == dp[i - 1][j]) {	//如果容量不够,相对于就不拿取
			items[i] = 0;
			fillItems(i - 1, j);
		}
		else if ((j - weights[i] >= 0) && (dp[i][j] == dp[i - 1][j - weights[i]] + values[i])) {	//容量足够并且为决策最优解
			items[i] = 1;
			fillItems(i - 1, j - weights[i]);
		}
	}
}

void printOptimal() {		//输出最优解
	//for (int i = 0; i < packageNum; i++) {			//动态规划表输出
	//	for (int j = 0; j < (bagCap + 1); j++) {
	//		cout << dp[i][j] << ' ';
	//	}
	//	cout << endl;
	//}
	//cout << endl;

	for (int i = 1; i < packageNum + 1; i++)			//最优解输出,第一个不输出
	{
		if (i == packageNum)
		{
			cout << items[i];
		}
		else
		{
			cout << items[i] << "->";
		}
	}
	cout << endl;
}

int main()
{
	fillDp();
	fillItems(packageNum, bagCap);
	printOptimal();

	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值