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

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执行上下文详解

    JavaScript 执行上下文详解 JavaScript(以下简称 JS)是一种运行在浏览器中的编程语言,它常常被用来实现交互性和动画效果。理解 JavaScript 的执行上下文对于掌握 JS 编程至关重要,这篇文章将为你详细讲解 JS 执行上下文的工作原理及其相关的知识点。 JS 执行上下文 JS 执行上下文是在代码执行时,JavaScript 引擎所…

    JavaScript 2023年6月10日
    00
  • window.location.href = window.location.href 跳转无反应 a超链接onclick事件写法

    实现网页跳转一般有两种方式:使用链接元素(<a>)或通过JavaScript修改window.location属性。但有时候,这两种方式都可能失败,如当链接元素的href属性值是JavaScript时,点击该链接时,页面不会发生跳转。或是在使用JavaScript的window.location.href属性跳转的过程中,我们想要弹出提示框或者执…

    JavaScript 2023年6月11日
    00
  • 简单易用的倒计时js代码

    下面是一份简单易用的倒计时js代码的攻略: 1. 先导入jQuery库 <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> 2. 创建一个HTML元素作为计数器容器 可以把它放在合适的地方,如下所示: <div id=&quo…

    JavaScript 2023年5月27日
    00
  • 分享十八个杀手级JavaScript单行代码

    下面我来详细讲解“分享十八个杀手级JavaScript单行代码”的完整攻略。 什么是“十八个杀手级JavaScript单行代码”? “十八个杀手级JavaScript单行代码”是一份由王福朋所分享的关于JavaScript技巧的文章,包含了18个利用JavaScript语言精妙之处的单行代码示例,涵盖了诸如类型判断、数组去重、随机排序等方面。 怎样使用这些代…

    JavaScript 2023年5月18日
    00
  • 七种JS实现数组去重的方式

    七种JS实现数组去重的方式 数组去重是JS中常用的操作之一。本文将介绍七种JS实现数组去重的方式,其中包括了常见的基于ES6的Set去重方式、基于map去重方式,以及经典的双重循环方式、indexOf方式、includes方式、filter方式和reduce方式。 在介绍这七种去重方式前,先定义一个示例数组arr,便于后续的演示: const arr = […

    JavaScript 2023年5月27日
    00
  • js实现鼠标悬浮框效果

    JavaScript 实现鼠标悬浮框效果的过程主要分为以下几步: 1. 创建 HTML 结构 首先需要在 HTML 中定义框架,例如容器、容器内的内容、触发事件的 DOM 元素等。其中包含一个容器作为悬浮框,在鼠标触发事件后自动显示,同时鼠标移出事件后自动隐藏。 例如: <div class="parent"> <but…

    JavaScript 2023年6月11日
    00
  • JavaScript实现的反序列化json字符串操作示例

    JavaScript实现反序列化json字符串的操作示例,可以使用JSON.parse(),eval()等方法实现。 1.使用JSON.parse()方法实现反序列化json字符串 示例代码如下: const jsonString = ‘{"name":"Lily","age":20,"s…

    JavaScript 2023年5月27日
    00
  • javascript 在线文本编辑器实现代码

    实现一个 JavaScript 在线文本编辑器的具体思路如下: 创建一个文本输入框,接受用户输入的文本; 创建一个可编辑的文本区域,将用户输入的文本显示在此区域内; 设置文本区域的样式和属性,使之可编辑; 当用户在文本区域中进行编辑操作时,通过 JavaScript 监听用户的输入操作,并实时更新显示内容; 将编辑后的文本内容提交到后台进行保存。 下面是实现…

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