笔记(01背包)

01背包: n种物品,每种物品只有一个

所有背包问题的基础233

(区别于完全背包:n种物品,每种物品有无限个,多重背包:n种物品,每种物品的个数各不相同)

每种物品有自己的重量和自己的价值,有一个最多只能放重量为m的背包,问此背包最多能装价值为多少的物品

举个栗子:

重量价值
物品0215
物品1320
物品2430

背包最大重量为4

定义一个二维数组dp[i][j];

这个dp数组的含义,其实是:

[0,i]下标从0-i之间的物品

也就是上面的表格中的物品编号0,1,2任取一个放进容量为j的背包里

我们的递推都是要围绕着这个dp数组的含义来写

接下来来确定递推公式

当前背包的状态其实取决于选择放或不放当前的这个物品i,放物品i是一个状态,不放物品i是一另个状态

我们假设不放物品i,那么是什么状态呢?

数组dp[i][j]中,不放物品i容量为j,*它所能装的最大价值是dp[i-1][j]

(为什么是i-1呢?就是0到i-1之间物品任取,就是相当于不放物品i)

如果放物品i呢?

此时的最大价值应该是这个背包容量减去物品i的容量之后所能放的最大价值,再加上物品i的价值

*它所能装的最大价值是dp[i-1][j-weight[i]]+value[i]

(为什么这里放了物品i还是[i-1]呢?后面要加上value[i],但是加之前还没放)

那么我们要找最大值,那自然是比较放与不放两种状态哪一种的价值最高

那么,我们的递推公式dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i])

我们看一下最后的模板 

for( ) {      //遍历物品(两层for循环可以对调顺序)
    for( ) {  //遍历背包
        dp[i][j]=max(dp[i-1][j],dp[i-1][j-weight[i]]+value[i]); //递推公式
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值