【数据结构与算法】01背包问题及输出具体方案

本文介绍了使用动态规划解决01背包问题的过程,以三件物品的重量和价值为例,详细解释了状态定义、解题思路和代码实现,最后给出了逆向运算找出最优解的方法。

背景

最近重新复习下动态规划相关知识,所以把经典的背包问题拿出来重新看下。最为经典的莫过于背包九讲,详见:
这里只是把自己在做的过程中一些想法记录下来。

本文主要描述01背包问题。背包问题指的是我们有多少件物品要放进背包,求放进背包的价值最大。而01背包指的是每个种类的物品只有1件。

让我们看下具体问题

现在有三件物品,笔记本、手机跟手表。每件物品重量跟价值如下:

物品 笔记本 手机 手表
重量 3kg 1kg 1kg
价值 2000 5000 3000

现有一个4kg的背包,请问要怎么分配空间,使得整体价值最大。

解题思路

动态规划的思路实际就是把大的问题拆分成小的问题,
这里我们先定义状态:dp[i][j],把前i个物品放到容量为j的背包里的最大价值。
那么有:
1)如果第i件物品,我们选择放到背包里(背包有足够容量j-weight[i]>0):
dp[i][j] = max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i])
2)不放到背包里:
dp[i][j] = dp[i-1][j]
按照这个思路,遍历 i:1-3,j:1-4
i=0,j=0~4,这是不管背包多少重量,都没有价值,所以dp[0][j] = 0。这也是dp[][]的初始状态,相当于这里进行了初始化。
i=1,这时我们看下笔记本时,背包重量从1到4的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值