c——cost(费用) w——weight(价值)
01背包的第二层循环可以简化 从V到c[i],因为费用为c[i]的物品不会影响dp[1]—dp[c[i]-1]的状态
所有的背包若只求最大值,不用必须装满时,初始化为0
若必须装满背包,初始化为负无穷
多重背包某个物品的总费用大于背包容量时可以按完全背包来算
不大于容量时,可以按一维背包算,每个物品乘系数,系数初始为1,每次*2,直到大于背包容量(大于背包容量这次不计算);最后再算一次总数减系数个的情况
二维费用背包
可能第二维的费用为隐藏条件,比如最多取x件。每取一件,付出的费用为1。
f[i][v][u],分别表示前i件,第一维费用,第二维费用,可以像01背包那样把前i件优化掉
二维费用背包的状态转移方程是f[i][v][u]=max(f[i-1][v][u],f[i-1][v-a[i]][u-b[i]]+w[i])
优化完也还是三层for循环
分组背包(每组取一个)
三重for循环,第一层组数,第二层背包容量(从v——0),第三层每组的物品
因为里面两层for循环的作用是找该组容量为v时的最大价值,每次更新,因为v不变,每组都从上一组更新过来,所以每组最多取一个。