0-1背包:有n种物品,每种物品仅有一个
完全背包:有n种物品,每种物品有无限个
多重背包:有n种物品,每种物品数量各不相同
0-1背包
暴力解法:使用回溯-每种物品仅两个状态【取或不取】
二维数组
dp数组的含义
dp[i][j] 最大价值
下标为0-i之间的物品 任取 放进容量为j的背包里 所能得到的最大价值为dp[i][j]
不放物品i:dp[i-1][j]
放物品i:dp[i-1][j-wright[i]] + value[i]
递推公式:
dp[i][j] = max(dp[i-1][j],dp[i-1][j-wright[i]] + value[i] )
初始化
对于纵列:背包容量为0放物品i 所以都初始化为 0
对于横列:背包容量为j为放物品0 当物品0的重量大于背包时初始为0,其他情况初始为物品0的重量
遍历顺序
对于二位数组的实现-两个for循环是可以颠倒的
一维数组
dp[j] 数组的含义
dp[j] 容量为j的背包所能装的最大价值为dp[j]
不妨物品i:dp[j]
放物品i:dp[j-wright[i]]+value[i]
dp[j] = max(dp[j])
递推公式
dp[j] = max(dp[j], dp[j-wright[i]] + value[i])
初始化
dp[0] 背包容量为 0 的时候装的最大价值 0
dp[0] = 0;
遍历顺序
倒序:保证不会多取
先遍历物品 再遍历背包