首页 > 其他分享 >01背包问题的js解决方式

01背包问题的js解决方式

时间:2023-10-30 09:00:10浏览次数:33  
标签:01 重量 这个 js 背包 包裹 当前 最优

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

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

实质上关于背包问题网上的东西我大体都有看过,对于这个问题,常见的就是使背包重量动态增长,然后遍历每个要装入的这些包裹,当包裹的重量小于等于当前背包的重量时,就可以装进背包了,那应不应该把当前这个包裹装入呢,这取决于 装入这个包裹,和未装入这个包裹的时候哪个状态的背包的价值最大,所以,背包问题的关键是‘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,背包,包裹,当前,最优
From: https://www.cnblogs.com/ZiLongZiLong/p/17144936.html

相关文章

  • 面试必刷TOP101:16、删除有序链表中重复的元素-II
    一、题目二、题解importjava.util.*;publicclassSolution{publicListNodedeleteDuplicates(ListNodehead){//空链表if(head==null)returnnull;ListNoderes=newListNode(0);//在链表前加一个表头......
  • Xilinx VIvado学习-01 数值处理之乘法(有符号)
    Verilog数值处理,在处理减法的时候,需要注意溢出问题。实例:a*b=c 1modulesi_product(2inputsigned[9:0]a,3inputsigned[7:0]b,4outputsigned[17:0]product5);6assignproduct=a*b;7endmodule仿真代码:1modulesi_product_tb;2regsys_......
  • Xilinx VIvado学习-01 数值处理之乘法(无符号)
    Verilog数值处理,在处理减法的时候,需要注意溢出问题。实例:a*b=c 1`timescale1ns/1ps2//////////////////////////////////////////////////////////////////////////////////3//Company:4//Engineer:5//6//CreateDate:2023/10/2323:33:077//......
  • 『做题记录』[CF1601F]Two Sorts
    [CF1601F]TwoSortslink:https://codeforces.com/problemset/problem/1601/FDescription  有一个数列\(\{a_1,a_2,\ldots,a_n\}\)是一个\(1\simn\)的排列,且所有的数都按照字典序排序,现在给出整数\(n(1\leqn\leq10^{12})\),求\(\left(\sum_{i=1}^n((i-a_i)\bm......
  • # 学期2023-2024-1 20231401 《计算机基础与程序设计》第五周学习总结
    学期2023-2024-120231401《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程2023-2024-1-计算机基础与程序设计这个作业要求在哪里2023-2024-1计算机基础与程序设计第五周作业这个作业的目标自学教材:计算机科学概论第6章,C语言程序设计第4章并......
  • NOIP2018 赛道修建
    观察题目不难想到二分答案。考虑二分所有赛道的最小长度值,那么我们可以去判断最后修建出来的赛道数是不是大于等于\(m\)条即可。用\(f_{i}\)表示当前以\(i\)为根,最长的未被赛道占用的链的长度。但是有很多链,匹配的过程不好进行,所以改为用multiset来维护当前点的链有多......
  • Pandas数据导入和导出:CSV、Excel、MySQL、JSON
    导入MySQL查询结果:read_sqlimportpandascon="mysql+pymysql://user:[email protected]/test"sql="SELECT*FROM`student`WHEREid=2"#sql查询df1=pandas.read_sql(sql=sql,con=con)print(df1)导入MySQL整张表:read_sql_table#整张表df2=pandas.rea......
  • js 生成随机数(含随机颜色)
    生成0-1之间的随机数Math.random()生成0-x之间的随机整数:Math.round(Math.random()*x)生成min-max之间的随机整数:Math.round(Math.random()*(max-min)+min)生成N位随机数/***函数--生成N位随机数*@param{*}N数字的长度*/functionrandomNum(N){returnString......
  • 基于jquery+html开发的json格式校验工具
    json简介JSON是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLanguage,StandardECMA-2623rdEdition-December1999的一个子集。JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C,C++,......
  • PyCharm 2018官方下载 V2018.1中文版 官方版特色
    PyCharm是一款非常不错的PythonIDE编辑器,主要是负责Python集成开发环境(IDE),拥有Python编程人员所需的一切工具和功能,同时还包含有Python、JavaScript、CoffeeScript、TypeScript以及CSS所需的智能化代码编辑器,为Python开发人员提供了广泛的基本工具,它们紧密集成在一起,从而为生产性P......