JS基于贪心算法解决背包问题示例

yizhihongxing

JS基于贪心算法解决背包问题示例

什么是贪心算法

贪心算法是一种直接寻求局部最优解以达到全局最优的算法,即采取贪心策略,每次做出当时看来最好的选择,不考虑将来的结果,也不进行回溯,只关心眼前的选择会不会对当前局面产生最优的影响。贪心算法的特点是简单、高效、易于证明正确性,并且常用于求解组合优化问题,如背包问题、最小生成树问题、哈夫曼编码等。

背包问题

背包问题是组合优化中的一个经典问题,其描述为:给定一个可装载重量为W的背包和n个物品,第i个物品的重量为wi,价值为vi,要求选出若干个物品放入背包中,使得装入背包的物品总重量不超过W,且总价值最大。

贪心算法解决背包问题

贪心算法求解背包问题的基本思路是按单位重量价值从高到低排序,优先选择单位重量价值高的物品,直到重量超过背包容量或者物品全部选择完毕。

function knapSack(capacity, weights, values) {
  var n = values.length; // 物品数量
  var load = 0; // 已装载的物品重量
  var val = 0; // 已装载的物品价值

  // 按单位重量价值从高到低排序
  var valPerWt = [];
  for (var i = 0; i < n; i++) {
    valPerWt[i] = values[i] / weights[i];
  }
  valPerWt.sort(function(a, b) {
    return b - a;
  });

  // 依次选择单位重量价值高的物品,直到重量超过背包容量或者物品全部选择完毕
  for (var i = 0; i < n; i++) {
    var j = valPerWt.indexOf(values[i] / weights[i]);
    if (weights[j] <= (capacity - load)) {
      load += weights[j];
      val += values[j];
      valPerWt.splice(j, 1);
      weights.splice(j, 1);
      values.splice(j, 1);
      i--;
    } else {
      var k = Math.floor((capacity - load) / weights[j]);
      load += k * weights[j];
      val += k * values[j];
      break;
    }
  }

  return val;
}

示例一

假设背包容量为10,有如下5个物品:

物品编号 重量 价值
1 2 11
2 3 7
3 4 15
4 5 6
5 6 18

运行下面的代码:

var capacity = 10;
var weights = [2, 3, 4, 5, 6];
var values = [11, 7, 15, 6, 18];
console.log(knapSack(capacity, weights, values));

输出结果为:34,表示选取物品3和物品5,总重量为10,总价值为34。

示例二

假设背包容量为20,有如下6个物品:

物品编号 重量 价值
1 5 10
2 10 19
3 15 30
4 20 40
5 25 50
6 30 60

运行下面的代码:

var capacity = 20;
var weights = [5, 10, 15, 20, 25, 30];
var values = [10, 19, 30, 40, 50, 60];
console.log(knapSack(capacity, weights, values));

输出结果为:149,表示选取物品1、物品2、物品3和物品6,总重量为20,总价值为149。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS基于贪心算法解决背包问题示例 - Python技术站

(0)
上一篇 2023年5月28日
下一篇 2023年5月28日

相关文章

  • Javascript Date getDate() 方法

    以下是关于JavaScript Date对象的getDate()方法的完整攻略,包括两个示例说明。 JavaScript Date对象的getDate()方法 JavaScript Date对象的getDate()方法返回一个月中的某一天(1-31)。该方法可用于获取当前日期的天数。 下是使用Date对象的getDate()方法的示例: var date =…

    JavaScript 2023年5月11日
    00
  • MutationObserver监视对DOM 树所做更改的功能妙用

    MutationObserver是一种Web API,它可以监视对DOM树所做的更改,并在更改发生时触发回调函数。它可以监视DOM的三类更改:子节点树的更改、属性的更改以及文本内容的更改。MutationObserver的用途非常广泛,特别是在与React、Vue等前端框架结合使用时,可以帮助我们轻松地实现数据绑定、自定义指令等功能。 MutationObs…

    JavaScript 2023年6月11日
    00
  • 微信小程序页面导航介绍及使用详解

    微信小程序页面导航介绍及使用详解 在微信小程序中,页面导航是非常重要的功能。通过页面导航,用户可以在不同页面中跳转,从而实现小程序各种功能。 常用导航组件 在小程序中,常用的导航组件有 navigator 和 tabbar。其中 navigator 组件用于页面间的跳转,tabbar 组件则用于底部导航栏。 navigator 组件 navigator 组件…

    JavaScript 2023年6月11日
    00
  • quickjs 封装 JavaScript 沙箱详情

    下面我将详细讲解如何封装JavaScript沙箱并提供两个实例说明。 QuickJS 封装 JavaScript 沙箱 前置要求 在开始封装JavaScript沙箱前,我们需要了解以下知识: QuickJS: 一款高效的Javascript引擎 沙箱: 限制JavaScript执行环境,避免恶意代码执行或获取主程序敏感信息 思路与方案 为了实现封装JavaS…

    JavaScript 2023年6月10日
    00
  • ascii码表(二进制 十进制 十六进制)详细介绍

    ASCII码表(二进制、十进制、十六进制)详细介绍 什么是ASCII码表? ASCII码表(American Standard Code for Information Interchange)是一种用于将字符编码为数字的字符编码标准。它最初是在美国为电传打字机而设计的,但现在已经成为计算机系统和通信设备中使用的标准字符集。 ASCII码表的编码方式 ASC…

    JavaScript 2023年5月19日
    00
  • js为空或不是对象问题的快速解决方法

    这里是针对”js为空或不是对象问题的快速解决方法”的完整攻略。 背景分析 在开发JavaScript应用时,我们经常会遇到以下两种错误: Uncaught TypeError: Cannot read property ‘xxx’ of undefined 当我们使用某个对象属性时,出现了该错误,意味着该属性所属的对象没有被定义或为空。 Uncaught T…

    JavaScript 2023年5月18日
    00
  • 基于BootstrapValidator的Form表单验证(24)

    下面是一份详细的“基于BootstrapValidator的Form表单验证(24)”的完整攻略。 简介 在Web开发中,表单验证是非常重要的一部分,可以帮助我们保证用户输入的数据的准确性、有效性和安全性。BootstrapValidator是一个快速且易于使用的jQuery表单验证插件,它可以通过简单的配置和调用API即可实现表单验证。本攻略将带你一步步完…

    JavaScript 2023年6月10日
    00
  • 一个JavaScript获取元素当前高度的实例

    获取元素当前高度是前端开发中很常见的一个需求,使用JavaScript可以轻松实现。下面,我将为大家介绍详细的攻略。 一、获取元素高度的方法 我们可以通过以下两种方式获取元素的高度: offsetHeight属性:此属性可以获取元素的高度,包括padding和border,但不包括margin。 clientHeight属性:此属性可以获取元素的高度,包括p…

    JavaScript 2023年6月11日
    00
合作推广
合作推广
分享本页
返回顶部