算法—背包问题

作者 : 开心源码 本文共1032个字,预计阅读时间需要3分钟 发布时间: 2022-05-12 共153人阅读

algorithm

什么是背包问题:给出一系列矩阵,各自有值和容量,目标是找出总值最大的集合。这个问题的限制是,总容量必需小于等于”背包“的容量。

其实背包问题是一个组合优化问题:
有一个固定大小能够装 10W 的包以及一组有价值和重量的物品,找到一个最佳处理方案来装总重量不超过 10 的总价值最大的方案。

背包问题

我们来分析一下处理的思路,有关物品能否放入,答案其实就两个放入不放入。我们先初始化几个变量

  • n 表示 5 种物品
  • c 表示背包的承载能力
  • v 表示当前背包中物品的总价值
    如图从最后开始循环
  • 放入情况
    n = 4 c = 5 v =2
    • 继续向下这样进行递归为 4 放入还是不放入
  • 不放入情况
    n = 4 c =0 v = 0
    • 继续向下这样进行递归为 4 放入还是不放入

      基本思路

我们先用最简单递归来实现上面算法

代码

var weights = [3,4,5];var values = [2,3,4];// [[1,5],[2,3],[4,5],[2,3],[5,2]];function knapSackWithResu(n,c){    var result = 0, a, b;        if(n == 0 || c == 0){        result = 0;    }else if(weights[n] > c){        result = knapSackWithResu(n-1,c)    }else{        a = knapSackWithResu(n-1,c);        b = values[n] + knapSackWithResu(n-1,c-weights[n]);        result = a > b?a:b;    }    // console.log(result);    return result;}

问题

在上面的递归运算中同样存在着问题,就是重复运算的问题,我们需要在递归过程中将重复运算结果缓存起来以备用从而减少运算的重复来达到优化的目的。

function knapSack(n, c){    var i, w, a, b, ks = [];    for(i = 0; i <= n; i++){        ks[i] = []    }    for(i = 0; i <= n; i++){        for(w =0; w <= c; w++){                        if(i ==0 || w ==0){                ks[i][w] = 0;            }else if(weights[i-1] <= w){                a = values[i-1] + ks[i-1][w - weights[i-1]];                b = ks[i-1][w];                ks[i][w] = (a > b) ? a:b;            }else{                ks[i][w] = ks[i-1][w];            }        }    }    return ks[n][c];}

优化

感谢 cs dojo 分享图片
参考《javascript 数据结构与算法》

javascript

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 算法—背包问题

发表回复