动态规划之背包DP

2024-1-24
首先是 完全背包 和 0-1 背包:

同样是限制空间容量最大为 m,然后有 n 类物品,两者的区别在于:

① 完全背包中每一类物品有 ki 个,而 0-1 背包中每类物品只有 1 个。

② 实现上完全背包是正序循环的,而 0-1 背包是逆序循环的,因为前者需要考虑装多个物品的情况(这个从转移方程可以看出)

主要的应用场景:

① 经典的问题,直接敲板子上去交,注意,dp 一定要滚成一维,还有空间要开到 m 的最大取值。

② 遇到了凑数字这种题,给你一个凑数规则,问你怎么凑用到的数字数量最小,最小为几。

题外话:

关于拼凑的概念,怎么保证能够涵盖所有的情况呢?

P2347 [NOIP1996 提高组] 砝码称重

问,我们一共可以拼凑出多少个不同的数字:

我们可以把这道题看做状态压缩,在 bitset 中 S 的第 i 位表示的是数字 i 能否被表示出来,1 为可以, 0 为不可以。

很明显,如果此时 w 为 1,若是只有一个 w ,那么 $ S_{1}$ 应当是 1,而其他位必定为 0,若有两个,明显,S 的前两位都应当为 1。

思考第二个 1,是怎么来的,这是在原先只有一个 w 的情况下累加了一个,所以可以将当前结果看做是 S << w,也就是整体原先的 S 中成立的所有数 +1 后能够表示的数的集合。

过程 $(10)_2$ 右移一位,导致表示数字 2 的状态那一栏变为 1-> $(01)_2$

但是我们思考,我们之前的结果是否还是需要的呢,肯定的,这时我们只需要在按位或上在改变前的 S, 就大功告成啦。

注意,初始化:S[0] = 1。

最后统计 S 中 1 的数量,记得将数量 -1 才是答案。

posted @ 2024-01-24 21:35  AK_heaven  阅读(83)  评论(0)    收藏  举报