完全背包问题,求背包里价值最大时,背包里的东西

完全背包问题:

有N种物品和一个容量为V的背包,每种物品都有无限件可用,第i件物品消耗的容量为Ci,价值为Wi,求解放入哪些物品可以使得背包中总价值最大。

求这个问题的解可以用动态规划,
但是求出来解了又出现另外一个问题

背包里价值最大时,背包里的东西有哪些?

例题:

现在有四个物品,背包总容量为8,背包最多能装入价值为多少的物品?

在这里插入图片描述
这题的答案是 13
但是根据答案可行的组合却不是唯一的
组合可以是:
1、1、1、1
1、1、3
3、3
这求所有可能的组合呢?

关于背包问题不懂的我建议去看这个视频
这个视频清楚的讲述了最简单的背包问题。

我求解完全背包问题的代码在这
运行平台:Dev C++、Vs2019

#include <iostream>


using namespace std;

struct Goods {
	int vol;
	int value;

	Goods(int a, int b)
	{
		this->vol = a;
		this->value = b;
	}
};

void BeiBao();

int main()
{

	BeiBao();


	return 0;
}

void BeiBao()
{
	int result[9][5];
	for (int i = 0; i < 9; i++)
	{
		for (int j = 0; j < 5; j++)
		{

			result[i][j] = 0;
		}
	}

	Goods goods[4] = { Goods(2, 3), Goods(3, 4), Goods(4, 6), Goods(5, 7) };

	for (int i = 1; i < 9; i++)
	{
		for (int j = 1; j < 5; j++)
		{
			if (i / goods[j - 1].vol >= 0)
			{
				int* mid = new int[i / goods[j - 1].vol];
				mid[0] = 0;
				
				
				for (int n = 0; n < i / goods[j - 1].vol; n++)
				{
					mid[n] = (n + 1) * goods[j - 1].value;
					mid[n] += result[i - goods[j - 1].vol * (n + 1)][j];
					if (mid[0] < mid[n])
						mid[0] = mid[n];
				}

				result[i][j] = mid[0];
			}

			if (result[i][j] < result[i][j - 1])
				result[i][j] = result[i][j - 1];
		}
	}


	for (int i = 0; i < 5; i++)
	{
		for (int j = 0; j < 9; j++)
		{

			cout << result[j][i] << "   ";
		}

		cout << endl;
	}

}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值