动态规划——01背包问题

给定一组有固定价值和固定重量的物品,以及一个已知最大承重量的背包,求在不超过背包最大承重量的前提下,能放进背包里面的物品的最大总价值。要求物品不能分割开来。
01代表装或不装。
问题的难点在于哪里呢?

首先最终目的是总价值最大,而承重量则是一个限制条件。一般而言。对于背包问题的贪心算法是计算性价比后优先放入性价比高的物品,由于贪心类问题中允许把物体分开后放入背包,其实并不难。
而在动态分配问题中呢?
物体不能被分割的情况下,如何能做到价值的最大化变成了难点,不一定性价比最高的最后获得的总价值最高,因为承重量的限制可能导致你在放入性价比最高的物体后,就无法继续放入了,反而导致总价值不高。
举个例子:

限重   5  kg
质量: 1 ,2 , 4
价值:10,16,30

最大价值为40
如果按性价比排名放入只能拿到26了。

因此怎么去考虑这类问题呢?
就拿第一个物品来说
总的问题可以分解为两个子问题:
①装第一个物品 我剩余的空间能装多大价值的物品
②不装第一个物品 我剩余的空间能装多大价值的物品

类推到第i个物品:

if(c[i] > j)
     dp[i][j] = dp[i - 1][j];//情况②
else
     dp[i][j] = max(p[i - 1][j], p[i - 1][j - w[i]] + v[i]);//①

我慢慢分析这一行代码。
p[i][j]代表的是在限重为j的情况下,前n个物品能获得的最大价值。
max是系统函数max,返回两个值中的较大值。
是哪两个值呢?
p[ i-1 ][ j ]和 j - w[i] ] + v[ i ] ,分别对应两种子问题。
p[ i-1 ][ j ]对应的是上面的②,即在不拿第i个物品,在限重为j的情况下,前i-1个物品能取得的最大价值
j - w[i] ] + v[ i ] 对应①,即拿了第i个物品,在限重为j-w[i](第i个物品确定拿,剩余空间减小了)的情况下,前i-1个物品能拿到的最大价值加上第i个物品的价值

for(int i = 1; i <= N; i++)		//i对应第i个物品,i的循环放外面,V[i][] 对应数据由V[i-1][]  决定
	{
		for(int j = 1; j <= M; j++)	//j对应当前背包能承受重量为j
		{
			if(j >= [i])	
			{
				p[i][j] = max(p[i - 1][j], p[i - 1][j - w[i]] + v[i]);
			}
			else
			{
				p[i][j] = p[i - 1][j];
			}
		}
	}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值