背包问题:给定一组有固定价值和固定重量的物品,以及一个已知最大承重量的背包,求在不超过背包最大承重量的前提下,能放进背包里面的物品的最大总价值。这一类问题是典型的使用动态规划解决的问题。
1.0-1背包:指每一种物品都只有一件,可以选择放或者不放。
function bag(weight, value, target) {
const len = weight.length
// 1.初始化dp数组
const dp = Array(target + 1).fill(0)
dp[0] = 0
for (let i = weight[0]; i <= target; i++) {
dp[i] = value[0]
}
// console.log(dp);
// 2.状态转移方程
for (let i = 1; i < len; i++) {
// 使用一维数组存储,需逆序遍历
for (let j = target; j >= weight[i]; j--) {
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])
}
}
return dp[target]
}
console.log(bag([2, 2, 6, 5, 4], [6, 3, 5, 4, 6], 10)); // 15
2.完全背包:每种物品都有无限件。
function bag(weight, value, target) {
const len = weight.length
// 1.初始化dp数组
const dp = Array(target + 1).fill(0)
dp[0] = 0
// 较0-1背包问题删除第一行的初始化,都需要通过遍历比较进行确定
// for (let i = weight[0]; i <= target; i++) {
// dp[i] = value[0]
// }
console.log(dp);
// 2.状态转移方程
// 较0-1背包问题修改为从第一行开始遍历
for (let i = 0; i < len; i++) {
// 且为顺序遍历
for (let j = weight[i]; j <= target; j++) {
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i])
}
}
return dp[target]
}
console.log(bag([2, 2, 6, 5, 4], [6, 3, 5, 4, 6], 10)); // 30
3.多重背包问题:限制了每种物品的个数,解决多重背包问题,只需要把它转化为0-1背包问题即可。