序:部分背包
这一部分的内容是大家再熟悉不过的了
我举个栗子,金银岛
我想学过贪心的差不多都做过这道题
这一类问题有一个特点,就是物品可以分割(或者是可以选择物品的局部)
作为#round 3的序,我希望看过这篇博文的人能够认清这一类问题与后面的各类背包问题的区别
1.01背包
愉快的吃药就从现在开始啦!
按照套路,那个人应该出现了,不是么?
:哇,居然被你猜对了
我想,我宁愿自己猜错了
:我今天又有一个问题,你能帮帮我吗?
(内心:多少金币?)
:不过这次没有金币。
(我是拒绝的)什么问题?
:我今天又去了超市,看中了一些喜欢的东西,想全部买下来,钱是够,可是发现好像带不了那么多,我想请你帮帮忙,看看我怎样才能获得最大的价值。
巧了,这不是今天学的背包么?
哈哈,正好能够大显身手了,我们跟他去看看吧
(超市)
:你看,就是这些,这些,还有这些,哦对了,还有那些……
哇,这东西好像有点多,不过每个都只有一件,我们可以好好地看一看,帮他解决
我们看看啊:
商品名称 | 枣药丸 | 键盘 | 笔记本(不是电脑) | 鹊巢牌咖啡 | WEY神犇亲笔签名 |
重量 | 1 | 3 | 2 | 1 | 1 |
价值 | 5 | 8 | 1 | 2 | 99999999999 |
:我最多能带总重量$\leqslant3$的东西,超过就带不走了,啊啊啊啊啊啊啊啊啊啊啊我都想要啊……
我们先不理他,自己分析一下这道题目
恩...应该就是让我们在这里面选出一些东西总重量在3以内的东西,并使得它们的价值最大
这摆明了一个01背包嘛!我们就套进来试试吧
先设一个$w和c$两个数组用$w[i]$表示价值,用$c[i]$表示重量
再设一个$dp$二维数组并使$dp[i][j]$表示前$i$件物品正好放入容量为$j$的背包能够获得的最大价值
我们得到了两种不同的选择
一种是选择不放这个物品$dp[i][j]=dp[i-1][j]$
另一种是选择放这个物品$dp[i][j]=dp[i-1][j-c[i]]+w[i]$
然后把两个弄在一起,取最大值$max(dp[i-1][j],dp[i-1][j-c[i]]+w[i])$
这就是状态转移方程了~
顺便把边界条件弄出来
$dp[0][0]=0$
$dp[i][j]=-INF$