【趣学算法】Day3 贪心算法——背包问题

这篇具有很好参考价值的文章主要介绍了【趣学算法】Day3 贪心算法——背包问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

14天阅读挑战赛
努力是为了不平庸~
算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法!

【趣学算法】Day3 贪心算法——背包问题

 ❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️

🧑个人主页:@周小末天天开心

各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力

感谢!

📕该篇文章收录专栏—趣学算法

目录

题目描述

问题分析

算法设计 

完美图解

算法详解

(1)确定合适的数据结构。

(2)对物体按单位重量价值进行排序。

(3)使用贪心算法求解问题

算法分析


题目描述

        有n种物品,每种物品只有一个,第i种物品的重量为 wi,价值为 vi,背包的容量为 w,物品可以分割。如何放置物品,使装入背包的物品价值之和最大?

问题分析

(1)每次选择价值最大的物品装入背包。

(2)每次选择重量最小的物品装入背包。

(3)每次选择单位重量价值最大的物品转入背包。

        思考一下,如果选价值最大的物品,但重量非常大,则可能一个也装不下,分割一部分装入,价值未必是最高的;如果选重量最小的物品装入,则其价值不一定高,所以在总重量受到限制的情况下无法保证价值最大;而如果每次选单位重量价值最大的物品,则装满背包后一定能得到最大价值。

        因此,我们应采用第三种贪心策略——每次从剩下的物品中选单位重量价值最大的物品。

算法设计 

(1)确定合适的数据结构并初始化。首先将物品的重量、价值和单位重量价值定位为一种结构体类型,然后对物品按单位重量价值从大到小进行排序。

(2)根据贪心策略,按照单位重量价值从大到小选取物品,直到达到背包容量。如果在装入第 i 个物品时超出背包容量,则取该物品的一部分装入背包。

完美图解

        物品的价值和重量如表2-3所示。如果背包容量 w = 30,怎么才能装入最大价值的物品?

                                                                物品清单

物品 i3 1 2 3 4 5 6 7 8 9 10
重量 w[i] 4 2 9 5 5 8 5 4 5 5
价值 v[i] 3 8 18 6 8 20 5 6 7 15

(1)贪心策略是每次选单位重量价值(价值/重量)大的物品,因此可以按单位重量价值对物品进行降序排列,排序后的物品清单如下所示:

                                                         排序后的物品清单

物品 i 2 10 6 3 5 8 9 4 7 1
重量 w[i] 2 5 8 9 5 4 5 5 5 4
价值 v[i] 8 15 20 18 8 6 7 6 5 3
单位重量价值 4 3 2.5 2 1.6 1.5 1.4 1.2 1 0.75

 (2)按照贪心策略,每次选择单位重量价值大的物品装入背包。

(3)构造最优解

算法详解

(1)确定合适的数据结构。

struct node {
    double w; //每种物品的重量
    double v; //每种物品的价值
    double p; //每种物品的单位重量价值(价值/重量)
}

(2)对物体按单位重量价值进行排序。

bool cmp(node a, node b) { //自定义比较函数cmp
    return a.p > b.p; // 指定按照物品的单位重量价值进行降序排列
}
sort(s, s + n, cmp); //前两个参数分别为待排序数组的首地址和尾地址,cmp为比较函数

(3)使用贪心算法求解问题

double solve (int n, double w) {
    double sum = 0.0;    //sum表示已经装入物品的价值之和
    double cleft = w;    //背包的剩余容量
    for(int i = 0; i < n; i++) {    //是用贪心算法求解问题
        if(s[i].w < cleft) {    //如果物品的重量小于或等于剩余容量
            cleft -= s[i].w;
            sum += s[i].v;
        }
        else {    //如果物品的重量大于剩余容量
            sum += cleft * s[i].p;    //部分装入
            break;
        }
    }
    return sum;
}

算法分析

(1)时间复杂度:时间主要耗费在对物品按单位重量价值进行排序上,一般采用快速排序法,时间复杂度为O(nlogn)。

(2)空间复杂度:空间主要消耗在存储物品的单位重量价值上,空间复杂度为O(n)。                                                                                                                                         【趣学算法】Day3 贪心算法——背包问题      文章来源地址https://www.toymoban.com/news/detail-430790.html

到了这里,关于【趣学算法】Day3 贪心算法——背包问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【程序设计竞赛算法】背包问题——贪心法

    贪心算法是一种基于贪心策略的算法,它在每一步选择中都采取当前状态下的最优选择,以期望最终达到全局最优解。 背包问题是一个经典的组合优化问题,可以分为 0-1 背包问题和分数背包问题。其中,0-1 背包问题要求物品只能选择一次,而分数背包问题允许物品被选择多

    2024年02月03日
    浏览(44)
  • (C语言贪心算法)0/1背包问题

    已知一个载重为M的背包和n件物品,物品编号从0到n-1。第i件物品的重量为 wi,若将第i种物品装入背包将获益pi,这里,wi0,pi0,0=in。所谓0/1背包问题是指在物品不能分割,只能整件装入背包或不装入的情况下,求一种最佳装载方案使得总收益最大。 第 1 行中有 2 个正整

    2024年02月08日
    浏览(41)
  • c++—0/1背包问题--贪心算法(详解)

    贪心算法的基本思想 •贪心算法的特点是每个阶段所作的选择都是局部最优的,它期望通过所作的局部最优选择产生出一个全局最优解。 贪心与动态规划: 与动态规划不同的是,贪心是 鼠目寸光 ; 动态规划是 统揽全局 。 贪心:每个阶段产生的都是局部最优解 贪心算法的

    2024年02月04日
    浏览(41)
  • java实现0-1背包问题方案(动态规划-贪心算法-回溯-分支定界)

    动态规划算法时间复杂度较低,能够求解较大规模的问题,但空间复杂度较高,不适用于数据量较大的问题。 贪心算法时间复杂度较低,能够求解较大规模的问题,但不能保证求得的解是最优解。 回溯算法能够求解较小规模的问题,但时间复杂度较高,不适用于数据量较大

    2024年02月01日
    浏览(130)
  • 【趣学算法】Day4 分治算法——二分搜索

    14天阅读挑战赛 努力是为了不平庸~ 算法学习有些时候是枯燥的,这一次,让我们先人一步,趣学算法! ❤️一名热爱Java的大一学生,希望与各位大佬共同学习进步❤️ 🧑个人主页:@周小末天天开心 各位大佬的点赞👍 收藏⭐ 关注✅,是本人学习的最大动力 感谢! 📕该

    2024年02月07日
    浏览(38)
  • 湘潭大学 算法设计与分析实验 回溯 动态规划 贪心 模拟退火解决背包问题

    https://download.csdn.net/download/SQ_ZengYX/88620871 测试用例

    2024年02月02日
    浏览(62)
  • 【算法日志】动态规划刷题:01背包问题,多重背包问题(day37,day38)

    目录 前言 目标和(01背包) 一和零(01背包) 零钱兑换(多重背包) 排列总和(多重背包) 这两天都是背包问题,其中的01背包的一些应用问题需要一定的数学建模能力,需要i将实际问题简化成我们熟悉的背包问题;而这两天的多重背包问题还算比较基础,但也要我明白了

    2024年02月11日
    浏览(56)
  • 算法基础复盘笔记Day09【动态规划】—— 背包问题

    ❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于 Java后端开发 ,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得 关注 、 点赞 、 收藏 、 评论 ⭐️⭐️⭐️ 📣 您的支持将是我创作的动力,让我们一起加油进步吧!!!🎉🎉 1. 题目

    2023年04月22日
    浏览(51)
  • 【算法日志】贪心算法刷题:重叠区问题(day31)

    目录 前言 无重叠区间(筛选区间) 划分字母区间(切割区间)  合并区间 今日的重点是掌握重叠区问题。

    2024年02月12日
    浏览(48)
  • 力扣算法刷题Day42|动态规划:01背包问题 分割等和子集

    力扣题目:01背包问题(二维数组) 刷题时长:参考题解 解题方法:动态规划 + 二维dp数组 复杂度分析 时间 空间 问题总结 理解递推公式困难 本题收获 动规思路:两层for循环,第一层i遍历物品,第二层j枚举背包容量以内所有值 确定dp数组及下标的含义:dp[i][j] 表示从下标

    2024年02月13日
    浏览(62)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包