贪心法解决背包问题

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

贪心法的基本概念

(1)贪心法要解决的问题是这样的一类问题,有n个输入,问题的解由这n个输入的某个子集组成,同时要求这个子集必须满足某些事先给定的条件,这些必须满足的条件称为约束条件。

(2)满足约束条件的子集,被称为可行解。

(3)为了衡量可行解的优劣,事先也给出一定的标准,这些标准一般以函数的形式给出,这些函数被称为目标函数。

(4)那些使目标函数取极值的可行解,称为最优解。

选择能产生问题最优解的最优量度标准是使用贪心法设计求解的核心问题,我们在求解问题利用贪心法时需要考虑的最重要的就是量度标准。选择最优的度量标准可以有效地使用贪心方法进行设计求解。

背包问题:注意这个是非0,1问题的背包问题

1、问题描述        

给定n个物品和一个容量为M的背包,物品i的重量是wi,其效益值是pi ,xi为装入系数,背包问题就是如何选择装入背包的物品,使得装入背包中物品的总的效益值(Σpixi)最大。

2.算法设计

考虑下列情况下的背包问题:n=3,M=20,(p1,p2,p3)=(25,24,15),(w1,w2,w3)=(18,15,10)

(1)随意装  

(2)选择效益值最大的物品先装

(3)选择重量最轻的物品先装

(4)选择单位重量效益值最大的物品先装

通过这四种方法进行装入背包我们是可以发现第4种是我们可以得到效益最高的方法,这是因为我们背包问题的实际上量度标准就是单位重量效益。这个例子告诉我们选择好的优秀的量度标准在背包问题中是很重要的事情。

算法的描述:

贪心法解决背包问题

 在这里面就是如果背包的剩余容量是大于物品的重量的那么这个物品是可以放下的这个的解向量就是1继续进行这个循环,但如果背包的剩余容量是小于物品的重量那么就跳出这个循环将解向量设为剩余重量除以这个物品重量。例如背包剩余4KG但是物品有5KG那么就将物品放下4/5部分即解向量就是4/5。

举例说明         背包问题,M=60,P=(40,20,30,28,24,72,12), W=(18,12,20,28,4,16,8)

代码如下:

#include<stdio.h>
int main(){
    //前期的准备工作 
    int m=60;//背包的总容量 
    double sum=0.00;//总效益 
    double p[7]={40.00,20.00,30.00,28.00,24.00,72.00,12.00};//每个物品的效益 
    double w[7]={18.00,12.00,20.00,28.00,4.00,16.00,8.00};//每个物品的重量 
    double a[7];//单位重量的效益数组 
    for(int i=0;i<7;i++)
    a[i]=p[i]/w[i];
    //利用冒泡排序将单位重量效益排好顺序以及将每个物品重量和效益也相对应 
     for(int n=0;n<7;n++)
    {
        for(int i=0;i<6;i++)
    {
        if(a[i+1]<a[i])
        {
            double b;
            b=a[i];a[i]=a[i+1];a[i+1]=b;
            double c;
            c=w[i];w[i]=w[i+1];w[i+1]=c;
            double d;
            d=p[i];p[i]=p[i+1];p[i+1]=d;
        }
    }
    }
    //贪心算法 
    int k;
    for(k=6;k>=0;k--)
    {
        if(m>w[k])
        {
            printf("重量为%lf的物品装了1件\n",w[k]);
            m=m-w[k];
            sum=sum+p[k]; 
        }
        else
        break;
    }
    printf("重量为%lf的物品装了%.2f件\n",w[k],m/w[k]);
    sum=sum+p[k]*m/w[k];
    k--; 
    for(k;k>=0;k--)
    printf("重量为%lf的物品装了0件\n",w[k]);
    printf("总效益为%lf\n",sum);

运行结果:

​​​​​​​贪心法解决背包问题

 时间复杂度这主要是在排序的部分有时间复杂度: O(nlogn)

这里注意排序有很多优秀的算法可以有快速排序或者归并排序等等,所以该算法的时间复杂度是O(nlogn)。但是我个人一点书写习惯所书写代码用到的是冒泡排序,所以我的代码的时间复杂度为O(n*n)。这里做个区分文章来源地址https://www.toymoban.com/news/detail-496081.html

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

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

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

相关文章

  • 【算法-贪心】分数背包问题

    💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kuan 的首页,持续学习,不断总结,共同进步,活到老学到老 导航 檀越剑指大厂系列:全面总

    2024年02月08日
    浏览(30)
  • 贪心算法——背包问题

    14天阅读挑战赛 目录 1.题目描述      2.问题分析 3.算法设计 4.C++程序

    2023年04月18日
    浏览(67)
  • 【程序设计竞赛算法】背包问题——贪心法

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

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

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

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

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

    2024年02月08日
    浏览(29)
  • 背包问题算法全解析:动态规划和贪心算法详解

    计算机背包问题是动态规划算法中的经典问题。本文将从理论和实践两个方面深入探讨计算机背包问题,并通过实际案例分析,帮助读者更好地理解和应用该问题。 背包问题是一种经典的优化问题。有的时候我们需要将有一堆不同重量或者体积的物品放入背包,但是背包容量

    2024年02月09日
    浏览(39)
  • 【趣学算法】Day3 贪心算法——背包问题

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

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

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

    2024年02月01日
    浏览(92)
  • 贪心算法问题实验:贪心算法解决TSP问题

    TSP问题是指旅行商问题,即给定一组城市和每对城市之间的距离,求解访问每一座城市一次并回到起始城市的最短回路。它是组合优化中的一个NP困难问题,在运筹学和理论计算机科学中有着广泛的应用。 贪心算法是一种在每一步选择中都采取在当前状态下最好或最优(即最

    2024年02月03日
    浏览(31)
  • 回溯法解决01背包问题

    目录 一、分析 (一)定义问题的解空间 (二)确定解空间的组织结构 (三)搜索解空间  1. 约束条件 2. 限界条件 (四)搜索过程 二、举例 三、核心代码 四、完整代码 问题的解是从n个物品中选择一些物品使其在不超过容量的情况下价值最大。每个物品有且只有两种状态

    2024年01月21日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包