01背包问题的js解决方式

背包,问题,js,解决,方式 · 浏览次数 : 10

小编点评

由于背包重量动态增长,当背包重量与包裹里最小的重量相等的时候,结果集所确定的第一个结果的绝对正确性,往后背包重量继续增长的时候,确定当前包裹是否要加入背包时所参考的前一个的最优解值总是正确的。 因此,为了确定最优解,我们首先需要找到背包重量与包裹里最小的重量相等的点,也就是第一个最优解。由于背包重量动态增长,这个点一定是第一个最优解的绝对值。 最后,为了确保结果的可靠性,我们还考虑了加入这个包之前和没加入这个包之前背包的最优解,并根据这些最优解的大小比较,最终确定该包裹是否要加入背包。

正文

如果你有兴趣看这个相信你已经对背包问题有所了解,所以关于背包问题的描述,我就不写了。

只记录一下自己对这个问题的一些看法和思考,于我而言,这个东西现在困扰我的是如何确定最优解。

实质上关于背包问题网上的东西我大体都有看过,对于这个问题,常见的就是使背包重量动态增长,然后遍历每个要装入的这些包裹,当包裹的重量小于等于当前背包的重量时,就可以装进背包了,那应不应该把当前这个包裹装入呢,这取决于 装入这个包裹,和未装入这个包裹的时候哪个状态的背包的价值最大,所以,背包问题的关键是‘01’,要么装,要么不装。

然后问题来了,未装入这个包裹的时候,这个时候的背包的最大的价值在哪里呢?

首先,在背包重量逐渐增大至与最小包裹相等的时候,这个时候就出现了第一个最优解(背包里物品最大值),因为在他前边这个背包里是没有任何东西的,我们需要把它保存下来,怎么保存呢?以当前背包的重量为行标,当前包裹的序列为列标将其存到一个二维数组里,这样做了之后,在决定要不要将当前包裹扔进背包的时候,可以比较一下装进这个包裹和不装这个包裹时候背包的最优解,保存结果的那个二维数组行标减去当前包裹的重量,and列标减一 就是 当前包裹的前几个包裹扔进这个背包能获得的最优解,而有一个数学关系是始终成立的,就是: 当前背包的重量 - 当前包裹的重量  这个差值 确定的行标,如果该行存在,那么这个行数是 >= 0 的, 所以 当前背包的重量 >= 当前包裹的重量,这也就确定了我们现在的背包是可以装的下我们正在遍历的包裹的。

写一段试试吧:

/**
     *
     * @param {Array} items 包裹尺寸集
     * @param {Array} values包裹价值集
     * @param {number} bagSize 背包尺寸
     * @return {Array} 返回遍历后的数组,最优解在该数组的最后一个元素上
     */
function mostPrecious( items,values,bagSize ){
    let result = [];
    for( let size = 0 ; size <= bagSize; size++){
        result[size] = [];
        for( let item = 0; item < items.length; item++ ){
            if( size == 0 ){//背包尺寸为0装不下任何东西
                result[size][item] = 0;
                continue;
            }
             if( size - items[item] < 0 ){//当前重量的背包无法装下当前包裹,那么最优解的值就是前一个包裹能装进去的价值
                 result[size][item] = result[size][item-1] || 0;
                 continue;
             }
            if( size - items[item] >= 0 )
            {
              result[size][item] = Math.max( (result[ size - items[item] ][item-1]|| 0) + values[item],result[size][item-1] || 0 )
            }
        }
    }
    return result;
}

今天先写到这儿 bug 不断啊。。。

明天再改 ---  debug  2017-12-14---------

明天记录一下改bug中的心得,现在这个算法已经ok了

貌似没问题了 ---debug 2017-12-14 晚上-------

后记

回答一下开头提出的问题,为什么这么做就能确定最优解呢?

因为背包重量是由零开始动态增长的,这样保证了,当背包重量与包裹里最小的重量相等的时候,结果集所确定的第一个结果的绝对正确性,往后背包重量继续增长的时候,确定当前包裹是否要加入背包时所参考的前一个的最优解值总是正确的,也就保证了整个算法的正确性。

最后就是:决定要不要加入当前这个包,取决于,加入这个包之前的包裹能确定的最优解,加上这个包的value 和没加入这个包之前的背包的最优解谁更大。

与01背包问题的js解决方式相似的内容:

01背包问题的js解决方式

如果你有兴趣看这个相信你已经对背包问题有所了解,所以关于背包问题的描述,我就不写了。只记录一下自己对这个问题的一些看法和思考,于我而言,这个东西现在困扰我的是如何确定最优解。实质上关于背包问题网上的东西我大体都有看过,对于这个问题,常见的就是使背包重量动态增长,然后遍历每个要装入的这些包裹,当包裹的

01背包问题

题目 题目描述 有 N N N 件物品和一个容量是 V V V 的背包。每件物品只能使用一次。 第 i i i 件物品的体积是 v i v_i vi​,价值是 w i w_i wi​。 求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。 输出最大价值。 输入格式 第一行两个整

LeetCode 周赛 350(2023/06/18)01 背包变型题

> **本文已收录到 [AndroidFamily](https://github.com/pengxurui/AndroidFamily),技术和职场问题,请关注公众号 [彭旭锐] 和 [BaguTree Pro] 知识星球提问。** - 往期回顾:[LeetCode 单周赛第 348 场 · 数

数据库实践丨使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题

摘要:用户使用Mogdb 2.0.1版本进行业务上线测试,发现在插入数据时,应用日志中提示primary key冲突,用户自查业务SQL没有问题,接到通知后,招手处理故障。 本文分享自华为云社区《使用MTK迁移Mysql源库后主键自增列导致数据无法插入问题》,作者:Gauss松鼠会。 故障背景 用户

背包DP

01 背包 \(01\) 的意图很明显,就是每个物品有 \(01\),即 选 和 不选 两种方式。 暴力 考虑设定一个状态 \(dp[i][j]\) 表示在前 \(i\) 个当中,花费为 \(j\) 所能获得的最大值。 转移可以: \(dp_{i,j}=\max(dp_{i-1,j},dp_{i-1

背包DP——多重背包

多重背包也是 0-1 背包的一个变式。与 0-1 背包的区别在于每种物品有 k 个,而非一个。 朴素 直接把相同的每个物品视作各个单独的物品,没有关联,仅条件相同; 转换后直接用01背包的状态转移方程 注意:在大数据下容易爆空间时间 二进制分组优化 与朴素相比,优化利用二进制原理(任意数可以由多个不

[转帖]TIKV扩容之刨坑填坑​

01 背景 某tidb集群收到告警,TIKV 节点磁盘使用率85%以上,联系业务无法快速删除数据,于是想到扩容TIKV 节点,原先TIKV 节点机器都是6TB的硬盘,目前只有3TB的机器可扩,也担心region 均衡后会不会打满3TB的盘,PD 调度策略来看应该是会根据不同存储机器的资源配置和使用情

一文了解Spark引擎的优势及应用场景

Spark引擎诞生的背景 Spark的发展历程可以追溯到2009年,由加州大学伯克利分校的AMPLab研究团队发起。成为Apache软件基金会的孵化项目后,于2012年发布了第一个稳定版本。 以下是Spark的主要发展里程碑: 初始版本发布:2010年开发的Matei Zaharia的研究项目成为S

k8s 入门到实战--部署应用到 k8s

![k8s 入门到实战 01.png](https://s2.loli.net/2023/09/04/ymUpcXZrxfNsT91.png) # 背景 最近这这段时间更新了一些 k8s 相关的博客和视频,也收到了一些反馈;大概分为这几类: - 公司已经经历过服务化改造了,但还未接触过云原生。 -

[转帖]10+倍性能提升全过程

https://plantegg.github.io/2018/01/23/10+%E5%80%8D%E6%80%A7%E8%83%BD%E6%8F%90%E5%8D%87%E5%85%A8%E8%BF%87%E7%A8%8B/ 背景说明 2016年的双11在淘宝上买买买的时候,天猫和优酷土豆一起做