算法|DP 背包问题

DP 背包问题

分类

重点关注 01背包和完全背包即可

  1. 01 背包: 只有一个, 选或者不选
  2. 完全被包:无限个数, 选还是不选
    在这里插入图片描述

背包逻辑

function testWeightBagProblem(weight, value, size) {
  const len = weight.length;
  const dp = Array(len)
    .fill()
    .map(() => Array(size + 1).fill(0));
  //   初始化 第一个物品的重量, 无论几个总重量是多少,都等于第一个起始重量
  for (j = weight[0]; j <= size; j++) {
    dp[0][j] = value[0];
  }
  //   循环物品
  for (let i = 1; i < len; i++) {
    // 循环背包
    for (let j = 0; j <= size; j++) {
      // 当前重量大于背包重量
      if (weight[i] > j) {
        dp[i][j] = dp[i - 1][j];
      } else {
        // dp[i - 1][j - weight[i]]   为j - weight[i]   不放物品时候的最大价值
        dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
      }
    }
    console.table(dp);
  }
  return dp[len - 1][size];
}
console.log(testWeightBagProblem([2, 3, 5], [15, 20, 30], 6));
┌─────────┬───┬───┬────┬────┬────┬────┬────┐
 (index)0123456  │
├─────────┼───┼───┼────┼────┼────┼────┼────┤
│    0001515151515 │
│    1001520203535 │
│    2001520203535 │
└─────────┴───┴───┴────┴────┴────┴────┴────┘
35

记录点

  1. 定义dp, 到底是一维还是二维数组,默认是填0,不可直接fill([0,0]), 会内存地址公用
  2. 初始化dp数组, 来一个for循环,这里的起点是物品重量的起始值
  3. 双for循环, 从物品循环, 再重量循环
  4. 当前物品重量大于 j, 则沿用上一个dp值, 反之取上一个dp值和 不放该物品的dp值+该物品的价值中的最大值
  5. 返回结果
  6. 递推公式 dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]) 还是挺绕的, 需要记忆
  7. 凡是有i-1的循环, 必须考虑多生成一个长度, 从0开始, 如size本来是6, 生成的二维数组要size+1, 变成7个
  • 10
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值