IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 贪心算法理解与经典案例---背包案例 -> 正文阅读

[数据结构与算法]贪心算法理解与经典案例---背包案例

如题:

已知五个物品重量分别是:{10,15,18,20,25};
五个物品价值依次为{12,15,20,25,27};
现有一个能容纳重量100的背包,求如何搭配能使不超过背包容量装下最大价值的物品!

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解 。

贪心算法一般按如下步骤进行

  1. 建立数学模型来描述问题
  2. 把求解的问题分成若干个子问题
  3. 对每个子问题求解,得到子问题的局部最优解
  4. 把子问题的解局部最优解合成原来解问题的一个解

我们按照步骤依次来分析:如题,简单来说就是如何在重量100的限制下选出物品的最佳配置。

这里我们有三个可以思考的策略

  1. 每次装入的都是价值和重量比率最高的,也就是我们常说的性价比最高的
  2. 每次装入的是当前可选择的东西中,价值最高的
  3. 每次装入的是当前可选择东西中,重量最轻的

首先我们本能上会觉得策略一是最佳方案,我们将思路转换成代码来验证一下:

let arr = [
    //货物名,重量,价值
    { name: 'goodA',  weight: 10, value: 12 },
    { name: 'goodB',  weight: 15, value: 15 },
    { name: 'goodC',  weight: 18, value: 21 },
    { name: 'goodD',  weight: 20, value: 25 },
    { name: 'goodE',  weight: 25, value: 27 },
  ]
function greedy(data) {//data为背包容量
    arr.map(e => {
        e.ratio=e.value/e.weight;//计算价值与重量比率,比率越高越好
    })
    // 我们先排序
    let sort=arr.sort(compare('ratio'))
    let values=0;
    // 我们先用比率最大的装满背包---直到装不下为止,取余数依次往下装
    sort.map(el=>{
        if(data>el.weight){
            values=values+parseInt(data/el.weight)*el.value
            data=data%el.weight
        }
    })
    console.log(values);
}
// 数组排序方法
function compare(value) {//value:根据什么属性排序
     return function(a,b){
      var value1 = a[value];
      var value2 = b[value];
      /*
      * value2 - value1; ——> 降序
      * value1 - value2; ——> 升序
      */
      return value2- value1;//升序排序
     }
    }
greedy(119);//背包的容量

我的思路是先计算重量价值比,再降序排列,比率最大的优先装到最大,剩余重量依次往下排,当余数大于下一个货物重量时,再求整取余,获得最终的最大价值的方案。

在这里插入图片描述
结果输出完毕。这是实现按比例的思路实现的最优解,哪装入价值最大与装入最轻的值会更小吗?我推测应该是的,这个问题就留给小伙伴你们来尝试一下了。

晚安,头有点疼了

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-01 12:10:49  更:2021-09-01 12:11:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 0:24:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码