【背包问题】贪心算法及其它

0022算法笔记——【贪心算法】背包问题,最优装载问题 1、背包问题      (1)0-1背包问题:给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大?      注:在选择装入背包的物品时,对每种物品i只有2种选择,即装入背包或不装入背包。不能将物品i装入背包多次,也不能只装入部分的物品i。       0-1背包问题可用动态规划算法来求解,具体过程可参看笔者博文 阅读详情

声明

作者非职业程序员,本文仅在分享自己的心得,错误较多欢迎指出,各位大佬不喜勿喷

本文采用和作者一样的小白一理解的的Pascal语言

这篇博客同时为了我的一位不懂代码但对算法十分感兴趣的朋友而写,故没有放一些“高级”元素

写得有些草率哈,请谅解:P

本文为介绍贪心算法,重点讲述部分背包问题。

本文参考背包问题详解(含代码)_林一百二十八的博客-优快云博客

一、题目描述

1.01背包

有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的空间是 Ci,得到的价值是 Wi。求解将哪些物品装入背包可使价值总和最大。

特点:每种物品仅有一个,可以选择放或者不放。也就是0(不放入)和1(放入)这两种状态

2.部分背包

有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的空间是 Ci,得到的价值是 Wi,物品可以分割。求解将哪些物品装入背包可使价值总和最大。

特点:物品可以分割

3.完全背包

有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的费用是Ci,价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗费的费用总和不超过背包容量,且价值总和最大。

特点:每一种物品都可以无限使用

4.多重背包

有N种物品和一个容量为V的背包。第i种物品最多有Mi件可用,每件耗费的空间是Ci,价值是Wi。求解将哪些物品装入背包可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。

特点:每一种物品的数量不同

5.其它背包……

分组背包、关联背包……还有那些长得不像背包问题的背包问题……

第一讲 01背包问题

这是最基本的背包问题,每个物品最多只能放一次。

第二讲 完全背包问题

第二个基本的背包问题模型,每种物品可以放无限多次。

第三讲 多重背包问题

每种物品有一个固定的次数上限。

第四讲 混合三种背包问题

将前面三种简单的问题叠加成较复杂的问题。

第五讲 二维费用的背包问题

一个简单的常见扩展。

第六讲 分组的背包问题

一种题目类型,也是一个有用的模型。后两节的基础。

第七讲 有依赖的背包问题

另一种给物品的选取加上限制的方法。

第八讲 泛化物品

我自己关于背包问题的思考成果,有一点抽象。

第九讲 背包问题问法的变化

试图触类旁通、举一反三。

------------------------------

转载自

xiaoyao_zhang

二、题目分析

1.部分背包&贪心算法

从特点入手,物品可以分割,意味着我们不必因为填不满背包而苦恼。在分割过程中,去抓住不变的量,比如——性价比,即Wi/Ci,表示单位重量的价值。那么如何去放呢?既然不用担心空间浪费或安排不合理,那就直接把所有物品按性价比从大到小排序,依次装入背包,到装不下时,就分割当前物品,把剩余空间填满。

①.贪心算法

这个思路中,我们确保每次装进去的都是目前剩下性价比最高的物品,所以总的价值也就最大了。这就是贪心算法。贪心算法中,正如其名,不考虑以后可能的分支,而是专注于当前子问题的最优解。我就要最好的,管它有没有更好的,就这么简单。

②.活学活用

有这么一个最优装载问题:有 N 件物品和一个容量为 V 的背包。放入第 i 件物品耗费的空间是 Ci,每件物品等价。求解将哪些物品装入背包可使价值总和最大。(不可分割)

这里物品等价,也就是说,Wi/Ci=1/Ci,故物品越小,性价比越划算,因此,我们可以得到如下的贪心思路:将物品按空间从小到大排序,从小的优先开始装,装到剩余空间不够了为止。

2.01背包

接下来咱按顺序过一遍。

对于无法分割的情况,目光短浅的贪心算法不再适用,穷举计算的暴力算法则会导致时间超限,那么如何优化呢?无穷枚举是一种搜索,优化搜索可以通过保留历史最优解的方式——嗯?动态规划!


关于动态规划,详见我的【【NOIP1999 普及组】导弹拦截——最长不上升子序列问题】动态规划-优快云博客文章浏览阅读136次。初次尝逝动态规划dp,从例题出发硬肝思想。数学归纳法在Coding中的体现(个人拙见)https://blog.youkuaiyun.com/MPCBexplorer/article/details/133953631


这里的动态转移方程为:

dp[i,v]=max(dp[i,v],dp[i−1,v−Ci]+Wi)

翻译一下:dp[i,v]储存将前i件物品放入容量为v的背包中这个子问题。dp[i,v]的初始值为dp[i-1,v],即前i-1个物品选择后的最大值。在面临对第i个物品的选择、当前背包容量为v时,取 1.不选这个物品,当前最大价值即为上一次判断之后的最大价值和 2.选择这个物品,当前价值即为上一次选择之后,剩余容量距离现在需要剩余容量恰为Ci时的价值加上这个物品的价值这两种情况下的最大值。

最后输出dp[N,V]即可。不难得出,只要物品信息确定,通过这个方程可以得出所有V的情况下的答案,最后按需选择V输出。

3.完全背包&多重背包

我这里只提供一种思路,其余思路参看大神文章(链接在开头)

一切问题转化为数学问题,一切数学问题转化为代数问题,一切代数问题转化为方程问题——笛卡尔

一切背包问题(除部分背包)转化为01背包问题,一切01背包问题转化为动态规划问题——MPCBexplorer


对于完全背包,不妨看作装满容量为j的背包,重量为wi的物品顶多V/ci件的01背包,即数量k<=j/wi。通过物品选择循环和重量遍历循环的基础上遍历k以达到目的

dp[i][j] = max(dp[i][j],dp[i-1][j-kci] + kwi), 0<=k<=j/ci


对于多重背包,大佬的两种思路,一种直接化为01背包,还有一种通过完全背包间接转化为01背包。我个人认为后者更易于理解。

完全背包,不就是有数量的01背包么?虽说数量无线,但一定有0<=k<=j/wi,k实际上是有范围的;多重背包也一样,不过有两种情况:1.当剩余空间足够,0<=k<=mi;2.当物品足够,0<=k<=j/wi——你看,无非多了个足够空间下取物上限的条件而已!在程序中具体决定哪一个为上限时,取

Ki=min(num[i],j/ci)

即可,然后就是上面完全背包的那一套思路:dp[i][j] = max(dp[i][j],dp[i-1][j-kci] + kwi)

三、上代码

1.部分背包

program part_bag;
var
        n,i:longint;
        v,ans:real;
        a,c,w:array[1..10000] of real;
//性价比排序
//系统文件中盗个快排改一下
//快排:基于二分查找法的一种排序
procedure sort(l,r: longint);
      var
         i,j: longint;
         x,y:real;
      begin
         i:=l;
         j:=r;
         x:=a[(l+r) div 2];
         repeat
           while a[i]<x do
            inc(i);
           while x<a[j] do
            dec(j);
           if not(i>j) then
             begin
                y:=a[i];
                a[i]:=a[j];
                a[j]:=y;
                y:=c[i];
                c[i]:=c[j];
                c[j]:=y;
                y:=w[i];
                w[i]:=w[j];
                w[j]:=y;
                inc(i);
                j:=j-1;
             end;
         until i>j;
         if l<j then
           sort(l,j);
         if i<r then
           sort(i,r);
      end;
begin
        //数量,大小
        read(n,v);
        for i:=1 to n do
                begin
                        //大小,价值
                        read(c[i],w[i]);
                        //性价比
                        a[i]:=w[i]/c[i];
                end;
        sort(1,n);
        //DEBUG调试: 输出排序后性价比
        //for i:=1 to n do writeln(a[i]:0:2);
        i:=n;
        //空间足够时
        while v>=c[i] do
                begin
                        //贪心:全部装入
                        ans:=ans+w[i];
                        v:=v-c[i];
                        dec(i);
                end;
        //分割最后一个物品
        ans:=ans+w[i]*(v/c[i]);
        writeln(ans:0:2);
end.

输入 #1

4 50↙

10 60↙

20 100↙

30 120↙

15 45↙

输出 #1

240.00

2.01背包

program o1_bag;
var
        n,v,i,j,best:longint;
        c,w:array[1..10000] of longint;
        //注意下标从0开始
        dp:array[0..10000,0..10000] of longint;
//取最大值的函数
function max(a,b:longint):longint;
        begin
                if a>b then exit(a)
                       else exit(b);
        end;
begin
        read(n,v);
        for i:=1 to n do read(c[i],w[i]);
        //i:在前i个物品中
        for i:=1 to n do
                //j:当剩余容量为j时
                for j:=0 to v do
                        begin
                                //无论剩余空间够不够,至少有
                                dp[i,j]:=dp[i-1,j];
                                //当剩余空间足够时
                                if j>=c[i] then dp[i,j]:=max(dp[i-1,j-c[i]]+w[i],dp[i,j]);
                        end;
        best:=0;
        //找出最大值输出
        for j:=1 to v do
                if dp[n,j]>best then best:=dp[n,j];
        writeln(best);
end.

输入 #1

4 5 ↙

1 2↙

2 4↙

3 4↙

4 5↙

输出 #1

8

3.完全背包

program completed_bag;
var
        n,v,i,j,k,best:longint;
        c,w:array[1..10000] of longint;
        //注意下标从0开始
        dp:array[0..10000,0..10000] of longint;
//取最大值的函数
function max(a,b:longint):longint;
        begin
                if a>b then exit(a)
                       else exit(b);
        end;
begin
        read(n,v);
        for i:=1 to n do read(c[i],w[i]);
        //i:在前i个物品中
        for i:=1 to n do
                //j:当剩余容量为j时
                for j:=0 to v do
                        begin
                                //无论剩余空间够不够,至少有
                                dp[i,j]:=dp[i-1,j];
                                for k:=0 to j div c[i] do
                                        //当剩余空间足够时
                                        if j>=k*c[i] then dp[i,j]:=max(dp[i-1,j-k*c[i]]+k*w[i],dp[i,j]);
                        end;
        best:=0;
        //找出最大值输出
        for j:=1 to v do
                if dp[n,j]>best then best:=dp[n,j];
        writeln(best);
end.

输入 #1

4 5↙

1 2↙

2 4↙

3 4↙

4 5↙

输出 #1

10

4.多重背包

program numbers_of_bags;
var
        n,v,i,j,k,best:longint;
        c,w,m:array[1..10000] of longint;
        //注意下标从0开始
        dp:array[0..10000,0..10000] of longint;
//取最大值的函数
function max(a,b:longint):longint;
        begin
                if a>b then exit(a)
                       else exit(b);
        end;
//取最小值的函数
function min(a,b:longint):longint;
        begin
                if a<b then exit(a)
                       else exit(b);
        end;
begin
        read(n,v);
        for i:=1 to n do read(c[i],w[i],m[i]);
        //i:在前i个物品中
        for i:=1 to n do
                //j:当剩余容量为j时
                for j:=0 to v do
                        begin
                                //无论剩余空间够不够,至少有
                                dp[i,j]:=dp[i-1,j];
                                for k:=0 to min(m[i],j div c[i]) do
                                        //当剩余空间足够时
                                        if j>=k*c[i] then dp[i,j]:=max(dp[i-1,j-k*c[i]]+k*w[i],dp[i,j]);
                        end;
        best:=0;
        //找出最大值输出
        for j:=1 to v do
                if dp[n,j]>best then best:=dp[n,j];
        writeln(best);
end.

输入 #1

3 7↙

2 3 12↙

2 5 15↙

1 2 3↙

输出 #1

17

四、结语

从背包问题的角度去讲解贪心算法,没想到主角竟然是动态规划。贪心是入门级的算法,应该掌握;不过以后出镜率不高,毕竟动态规划才是王道,贪心总是容易漏掉最优解。

诗云:

满屏荒唐言,一把辛酸泪。

都云Coder痴,谁解其中恨!

代码中若有BUG,恳请指出,谢谢!

累死偶咧!23点31分完初稿!

C++实现贪心算法之背包问题 阅读详情

相关推荐

C++实现算法设计——贪心算法(背包问题)

引言:网上的代码多多少少都有点问题,所以自己写了一个。 问题:贪心算法背包问题 假设有n种宝物,每种宝物i对应价值为vi,重量wi,毛驴只能运载重量为m的宝物。每种宝物只能拿1件,可分割。如何使得毛驴运走的宝物价值最大? 贪心策略: 1)每次挑选价值最大的宝物装入背包,得到的结果是否最优? 2)每次挑选重量最小的宝物装入背包,得到的结果是否最优?3)每次挑选单位重量价值最大的宝物,价值是否最高? 算法设计 贪心算法背包问题 1)数据结构及初始化。 计算性价比 结构体item用于存储宝物的重量、.

weixin_44296768的博客 1万+

背包九讲的总结笔记(一)

基础的01背包 题目: 有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。 基本思路: F[i,v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:F[i,v]=max{F[i−1,v],F[i−1,v−Ci]+Wi} 然后根据这个方程便可以写出伪代码,具体代码最好根据不同题目

林伏案的博客 801

小曾WRF自学日记(3)渐入佳境 ——WRF实例-数据下载与WPS前处理

ww

weixin_46297571的博客 1480

01背包

01背包     问题描述:         有n件物品和一个容量为v的背包。放入第i件物品的占的空间为Ci,得到的价值是Wi,求解将哪些物品装入背包可以          使得总价值最大;         首先要明白这个问题不能用贪心来做,因为当前的选择会影响到以后的选择,也就是说当前的选择的最优解         可能会影响到全局的最优解;        考虑用动态规划来做   ...

z93478462的博客 294

TESSY创建单元测试或集成测试工程

我们以tessy5.1为例,给大家展示单元测试和集成测试工程的创建过程。

空气中的告白专栏 1686

Win10 开机突然蓝屏错误代码0xc0000001安全模式也进不了,不用重装系统怎么修复?(已解决)九个解决参考方案

Win 10专业版HP480G7。

本博客,博文仅代表个人操作经验,不能完全解决你的问题,仅供参考,佛系回复。 1万+

动态规划之背包问题

前言 此篇博客主要讲常见的三种背包问题,0-1背包,完全背包,多重背包。为了加深理解,每个问题都有leetcode实例。 1. 0-1背包问题 1.1 题目 有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到 的价值是Wi。求解将哪些物品装入背包可使价值总和最大。 1.2 基本思路 这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不 放。 用子问题定义状态:即F[i...

米奇罗 433

YOLOv11改进 | 上采样篇 | YOLOv11引入CARAFE上采样

在本文中,我们提出了一个通用、轻量级、高效的特征重组算子CARAFE来实现这一目标.CARAFE有几个吸引人的特性:(1)大视场。(2)内容感知处理。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~大视场:不同于以往的方法(如双线性插值),CARAFE能够在更大的感受野内聚合上下文信息,从而捕获更丰富的语义信息。

tsg6698的博客 921

动态规划----背包问题(完全背包问题)

有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。...

ResCells的博客 375

YOLOv改进 | YOLOv11更换主干Backbone之MobileNetV2(轻量化主干网络结构--高效轻量移动模型)

本文提出将YOLOv11的主干网络替换为轻量化的MobileNetV2,以提升模型在移动端设备的部署效率。MobileNetV2通过倒残差结构和线性瓶颈层,显著减少了计算量和参数量(降至1M~3M),同时保持多尺度特征提取能力。实验表明,改进后的模型在移动设备上可实现20-30 FPS的实时检测,适用于手机APP、无人机和工业监控等场景。核心代码展示了倒残差块的实现,通过深度可分离卷积和通道扩展/压缩实现高效特征提取。

走向CTO的路上... 1461

ContextCapture系列教程(三):大疆精灵4RTK版无人机POS数据提取、处理(处理后勉强达到免相控要求)

大疆精灵 Phantom 4 RTK于2018年发布,是大疆为高精度建图与精准飞行设计的行业级无人机,在精灵4无人机外形的基础上,机身增加了RTK模块,可以实现高精度 RTK 定位导航,相机与 RTK 系统采用微秒级时间同步,可以通过app 进行航线规划飞行

pausau的博客 1万+

leetcode_4:背包问题

0-1背包: 有N件物品和一个容量为V的背包。第i件物品的费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量且价值总和最大。 思路: 每件物品仅一件,可以选择放与不放。用dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值,其状态转移方程定义为: dp[i][v] = max(dp[i-1][v] + dp[i-1][v-c[i]]+w...

陶将的博客 972

将Keil中的变量数组导出

首先,写好导出数据的函数。

小柚子的博客 1952

背包问题贪心算法求解

题目 有一个背包,背包容量是M=150。有7个物品,物品可以分割成任意大小。 要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。 思路 具有最优子结构性质和贪心选择性质。只要是所有物品的总重量大于背包容纳量,那么背包一定能装满。注意背包问题与0-1背包问题的区别。 这2类问题都具有最优子结构性质,极为相似,但背包问题可以用贪心算法求解,而0-1背包问题却不能用贪心算法求解。 求解步骤 用...

practical_sharp的博客 6万+

uniapp(全端兼容) - 实现点击输入框时完美顶起键盘,获取键盘高度动态计算顶起距离,解决软键盘弹出时输入框被覆盖问题,uniapp微信小程序/移动端h5网页/安卓苹果app(示例代码,一键复制

uniapp,支付宝微信小程序,移动端H5网页网站,软键盘弹出位置不对,软键盘挡住了输入框怎么办,获取键盘高度计算弹出距离,uniapp如何解决输入框input激活后键盘弹出遮挡问题,uniapp输入框偶尔被键盘遮挡,解决uniapp在App环境下输入框被软键盘遮挡的问题,uniapp 完美解决苹果和安卓input框遮挡兼容问题,uniapp输入框拉起软键盘时,输入框显示不全,被软键盘挡住一半,input被键盘遮挡的解决方案,软键盘遮挡输入框,uniapp软键盘顶不起来输入框,输入框没有被软键盘弹出来怎么办

✅ 精选推荐文章 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

用贪心算法解决背包问题

贪心算法:顾名思义,贪心算法总是能做到当前看来是最好的选择。也就是说贪心算法并不从整体最优上加以考虑,它所作出的选择只是在某种意义上的局部最优选择。 所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,是贪心算法与动态规划算法的主要区别。 0-1背包问题 给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为W。问应...

wangmengmeng99的博客 2万+

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

贪心算法解背包问题

辨析: 背包问题能用贪心算法求解,但是01背包问题不能用贪心算法求解(因为01背包问题不具备贪心选择性质----通过局部最优,达不到全局最优) 举个例子:背包容量=50; w[]={10,20,30} ,p[]={60,100,120} 用贪心选择(10+20)<50,p=160,但这并不是最优解,事实上(20+30)=50,p=100+120=220.才是问题的...

远行的博客 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

贪心算法解决背包问题

贪心算法解决背包问题 问题描述: 给定 n 个物品和一个容量为 C 的背包,请给出物品装入背包的方案,使得背包中物品的总价值 M 最大,并满足: 1.每个物品 I 的重量为 wi,价值为 vi。 2.每个物品可拆分,背包中物品的总重量不能超过容量 C 。 实验要求: 程序要求: 1)先写排序算法 Rank(),本文中使用快速排序完成,再写贪心算法 Greedy()。 2)两个步骤需要单独定义在程...

qq_41878620的博客 1万+

贪心算法 背包问题 java_贪心算法求解背包问题

一.贪心算法1.贪心算法概念贪婪算法(Greedy algorithm)是一种对某些求最优解问题的更简单、更迅速的设计技术。用贪婪法设计算法的特点是一步一步地进行,常以当前情况为基础根据某个优化测度作最优选择,而不考虑各种可能的整体情况,它省去了为找最优解要穷尽所有可能而必须耗费的大量时间,它采用自顶向下,以迭代的方法做出相继的贪心选择,每做一次贪心选择就将所求问题简化为一个规模更小的子问题,通过...

weixin_35126480的博客 1994

通过贪心算法来解决背包问题

通过贪心算法来解决背包问题 给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 ,价值wi (1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。 有两类背包问题(根据物品是否可以分割),如果物品不可以分割,称为0—1背包问题(动态规划);如果物品可以分割,则称为背包问题(贪心算法)。 我在这里写的是通过贪心算法来解决背包问题。 假设xi是物品i装入背包的部分(...

qq_43238335的博客 4864

背包问题(贪心算法)

讲到这里,就要说一说最佳的选择,每一次的放入的最佳的选择就是每次放入的物品都是剩余的物品中价值最大且质量最小的,这里就要引入一个物品的属性,物品的权重值。算法最开始是先声明物品类,因为后面要用到很多的物品属性,如果使用数组会有点麻烦,物品的属性有背包ID,物品价值,物品质量,物品权重值。算法的接下来就是将物品的数组按物品的权重值排序,权重值大的排在数组的前面,方便后面的运算。算法的主体就是从数组中取出物品对象,计算比较物品的质量和当前背包剩余重量的大小,如果大于,就计算要放入的百分比。本次讲一讲背包问题。

m0_62089210的博客 4923

贪心算法(背包问题)

贪心算法的思想: 不从整体最优考虑,总是做出当前看来最好的选择。 仅根据当前已有的信息做出选择,而且一旦做出了选择,不管将来有什么结果,这个选择都不会改变。 贪心算法的性质: 1)最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征。 2)贪心选择性:所谓贪心选择性质

千千 5505

背包问题的贪心算法

注意背包问题与0-1背包问题的不同,虽然这两个问题极为相似,但背包问题可以用贪心算法求解,而对于0-1背包问题,贪心选择算法不能得到最优解。因为在0-1背包问题的这种情况下,它无法保证最后能将背包装满,部分闲置的背包空间,使每公斤背包的价值降低了。(1)所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优解的选择,即贪心选择来达到。这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别。(2)当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质。

m0_72345017的博客 1958

C++贪心算法之背包问题

问题描述 题目分析 这个问题和0-1背包问题有一定的差别,0-1背包问题的解决方法可以参加我的另一篇文章0-1背包问题 这两类问题都具有最优子结构性质。对0-1背包问题,设A是能够装入容量为c的背包的具有最大价值的物品集合,则为Aj = A-{j}是n-1个物1,2,…j-1,j+1…n可装入容量为c-wj的背包的具有最大价值的物品集合。对于背包问题,类似地,若它的一个最优解包含物品j,则从该最...

weixin_44755413的博客 1778
上一篇: 论代码与注释
MPCBexplorer
博客等级 码龄3年 10粉丝 6原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值