美文网首页
动态规划中的背包问题

动态规划中的背包问题

作者: 企鹅的技术笔记 | 来源:发表于2019-03-14 15:50 被阅读0次

源自掘金 https://juejin.im/post/5c623ff3f265da2de1657f97, 此处有更多解释, 只是记录一下自己的理解

/**
 * * 动态规划中的`背包问题`
 * * 假设有 weights 种不同重量的物品, 他们各自的价值是 values, 在背包重量最大为 W 的情况下
 * * 怎么才能得到最大价值
 * @param weights 
 * @param values 
 * @param W 
 */
export function knapsack(weights:number[], values:number[], W:number) {
  /**
   * 建立一个二元数组存放背包表格
   * 横坐标逐渐提升背包容量 w 的值
   * 纵坐标是各个物品的情况
   * * 增加-1行, 让剩下的行数可以统一化计算
   */
  const n = weights.length;
  const table = new Array(n);
  table[-1] = new Array(W + 1).fill(0);
  // 选择的物品
  const select_item = [];

  // 建立剩下的行数
  for (let y = 0; y < n; y++) {
    const arr = table[y] = [];
    for (let x = 0; x <= W; x++) {
      /**
       * 情况只有两种, `放进该物品`与`不放该物品`
       * * 先假设放进物品, 那当前背包空位只有W - x = r, 在数据中寻找 r 列的最后一个数(即 r 的最大价值)
       * * 如果最大价值+当前物品价值 > 此列上一个值, 那么认为放进物品是最优解
       * * 否则不放进物品
       * * 所以最后放进的价值是之前最大价值或放进此物品的最大价值中比较大的那个
       */
      const rest_weight = x - weights[y];
      
      const last_max_value = table[y - 1][x];
      if (rest_weight < 0) {
        arr[x] = last_max_value;
      } else {
        const current_value = values[y];
        const rest_max_value = table[y - 1][rest_weight];
        arr[x] = Math.max(rest_max_value + current_value, last_max_value);
      }
    }
  }

  /**
   * 从最下一行往上寻找, 如果这一行的值大于上一行的, 说明最优解中放入了当前行的物品
   * 然后再减去此物品的重量, 继续寻找
   */
  let x = W, rest_weight = 10;
  for (let y = n; y--;) {
    const current_value = table[y][rest_weight];
    const last_value = table[y-1][rest_weight];
    if (current_value > last_value) {
      select_item.push(y);
      rest_weight = rest_weight - weights[y];
    }
  }
  
  
  return {
    table,
    select_item: select_item.reverse(),
  };
}

相关文章

  • 算法学习收藏

    动态规划问题 动态规划(最优子结构和重叠子问题的比较) 动态规划解决01背包问题 01背包问题 最优二叉查找树 《...

  • 动态规划中的背包问题

    源自掘金 https://juejin.im/post/5c623ff3f265da2de1657f97, 此处有...

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 2019-07-10 数据结构和算法(妙味杜鹏)

    八皇后 A *寻路 背包问题(动态规划方法) 背包问题(贪心算法)

  • 动态规划

    0-1背包问题 自己实现的0-1背包问题的动态规划解法,先贴上吧,动态规划原理解释有空再写。

  • 2022-02-19 动态规划高频题专题【1】

    动态规划基本类型 dp基础 背包问题 打家劫舍 股票问题 子序列问题 进阶动态规划 深入理解动态规划过程 定义dp...

  • 动态规划.背包问题

    动态规划 之 0-1背包问题 【背包问题】 现有n个物品,价值为`$$v_1,v_2....v_n$$ 重量为 现...

  • 动态规划 背包问题

    1.问题描述 有n个物体有重量和价值两个属性,一个能承重一定重量的背包。问怎么选择物体能实现背包里的价值最大化。 ...

  • 动态规划 背包问题

    本篇博文参考此博文,该博文PPT非常有助理解 问题描述:给定n种物品和一背包。物品i的重量是wi,其价值为vi,背...

  • 背包问题(动态规划)

    原理参见 屈婉玲老师 算法设计与分析 ORZ

网友评论

      本文标题:动态规划中的背包问题

      本文链接:https://www.haomeiwen.com/subject/occcmqtx.html