建议先看看前言:http://www.wutianqi.com/?p=2298

连载总目录:http://www.wutianqi.com/?p=2403

说到贪心算法,避免不了于DP对比,所以前面的DP要了解。

贪心算法是使所做的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解。

依然和上一章总结DP一样,我先给出一个最容易入门的例子,来看看神马是贪心?(是人就会贪心,这个算法很人性化啊

=。=)

一个最简单的例子:

部分背包问题:

有N个物品,第i个物品价值vi,重wi,现在你有一个可以装W 磅的包,你可以选择带走每个物品的全部或一部分,求如何选择可以使背包所装的价值最大?(这个是不是和前面DP中讲的01背包很像?认真看清楚两者题目的不同!)

假如有三种物品,背包可装50磅的物品,物品1重10磅,价值60元;物品2重20磅,价值100元;物品3重30磅,价值120元。因此,既然可以选择只装一部分,我们可以算出每种物品的单位价值,物品1是每磅6元,物品2是美邦5元,物品3是每磅4元。按照贪心策略,应该现状物品1,如果装完物品1背包还有空间,再装物品2……

最后的结果是:

而如果按01背包,则结果是:

有兴趣的可以拿我那01背包的程序去验证这个结果。

下面是一个部分背包的小程序:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

#include <iostream>
#include <algorithm>
using namespace std;typedef struct Thing{double v;     // valuedouble w;     // weight
}Thing;Thing arr[100];
int n;
double W;bool cmp(Thing a, Thing b)
{return a.v/a.w > b.v/b.w;
}int main()
{cout << "输入物品个数: ";cin >> n;cout << "输入背包可载重量: ";cin >> W;cout << "输入" << n << "个物品的价值和重量:" << endl;for(int i=0; i<n; ++i)cin >> arr[i].v >> arr[i].w;sort(arr, arr+n, cmp);int k = 0;double value = 0;while(W){if(W >= arr[k].w){W -= arr[k].w;value += arr[k].v;}else{value += W * arr[k].v / arr[k].w;W = 0;}++k;}cout << "最大价值是: " << value << endl;return 0;
}

结果如图:

Tanky Woo 标签: Tanky Woo,贪心算法,算法导论
在我独立博客上的原文:http://www.wutianqi.com/?p=2571
欢迎各位探讨。

转载于:https://www.cnblogs.com/tanky_woo/archive/2011/06/14/2080522.html

《算法导论》学习总结 — 21.第16章 贪心算法(1) 基础入门1相关推荐

  1. 《算法导论》第16章 贪心算法 个人笔记

    第16章 贪心算法 16.1 活动选择问题 问题:假设有一个n个活动的集合S=a1,a2,...,anS={a_1,a_2,...,a_n},这些活动使用同一个资源,而这个资源在某个时刻只能供一个活动 ...

  2. 【算法导论】学习笔记——第16章 贪心算法

    贪心算法是使做出的选择看起来都是当前最佳的,期望通过所做的局部最优选择来产生一个全局最优解.其实,这个定义旨在说明贪心算法必须伴随做出最优选择,如moving table,我们选择最大重叠数等等.当然 ...

  3. 【算法导论学习笔记】第3章:函数的增长

    原创博客,转载请注明: http://www.cnblogs.com/wuwenyan/p/4982713.html  当算法的输入n非常大的时候,对于算法复杂度的分析就显得尤为重要,虽然有时我们能通 ...

  4. 170916_算法导论学习(四)_2.3 设计算法_练习

    MERGE方法具有哨兵的写法: 什么是数学归纳法? 数学归纳法(Mathematical Induction, MI)是一种数学证明方法,通常被用于证明某个给定命题在整个(或者局部)自然数范围内成立. ...

  5. 算法导论第三版第十一章11.1-4

    算法导论第三版第十一章11.1-4 我们希望在一个非常大的数组上,通过利用直接寻址的方式来实现一个字典.开始时,该数组中可能包含一些无用信息,但要堆整个数组进行初始化时不太实际的,因为该数组的规模太大 ...

  6. 看懂《C程序设计(第五版)学习辅导》第16章中介绍的用Visual Studio 2010对C程序进行编辑、编译、连接和运行的方法,并进行以下操作

    看懂<C程序设计(第五版)学习辅导>第16章中介绍的用Visual Studio 2010对C程序进行编辑.编译.连接和运行的方法,并进行以下操作: 点我看视频讲解+可运行代码 记得收藏视 ...

  7. 【Java数据结构与算法】第十九章 贪心算法、Prim算法和Kruskal算法

    第十九章 贪心算法.Prim算法和Kruskal算法 文章目录 第十九章 贪心算法.Prim算法和Kruskal算法 一.贪心算法 1.介绍 2.支付问题 二.Prim算法 1.最小生成树 2.介绍 ...

  8. 算法设计与分析第3章 贪心算法

    第4章 贪心算法 贪心算法总是作出在当前看来最好的选择.也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择. 贪心算法的基本要素 1.贪心选择性质 所谓贪心选择性质是指所 ...

  9. 第四十一章 贪心算法——排序不等式

    第四十一章 贪心算法--排序不等式 一.题目信息 二.排序不等式 1.算法内容 2.算法证明 3.思路分析 三.代码实现 一.题目信息 二.排序不等式 1.算法内容 2.算法证明 3.思路分析 这道题 ...

最新文章

  1. 数据库与操作系统时区更改
  2. 爬虫之selenium标签页的切换
  3. 规则引擎QLExpress的简单应用
  4. java 静态方法中为什么不可以使用关键字this _super_Java static方法里为什么不能使用this关键字,和Super...
  5. ddr2和ddr3的区别
  6. java.lang.ClassCastException:android.widget.Button cannot be cast to android.widget.ImageView
  7. 系统请求从桌面计算机还原所有数据,电脑怎么一键还原
  8. Q134:PBRT-V3,次表面散射(Subsurface Scattering)(15.5章节)
  9. oracle 删除数据_2020最新最全数据库系统安全
  10. ubuntu 卸载openjdk 安装java8 安装之后提示Command ‘java‘ not found
  11. github 如何添加项目代码
  12. office2016图标显示异常,但是文档可以正常打开解决办法
  13. 一起谈.NET技术,走向ASP.NET架构设计——第二章:设计/ 测试/代码
  14. android版本内存卡,版本等级繁多 教你如何挑选手机内存卡
  15. 虚拟机更新升级,原来的GuestAdditions versions版本不匹配
  16. 编程环境搭建(云上编程和本地编程)
  17. android graphics2d,Graphics2D的drawString之不带颜色的字体
  18. Retrofit简介
  19. 对话框AlertDialog的使用
  20. arm el2与el3_armv8架构与指令集.整理.初稿.pdf

热门文章

  1. Netweaver是如何判断哪些对象可以被增强的
  2. SAP CRM和C4C的订单Number range
  3. SAP CRM订单状态下拉菜单字段里的值是怎么配出来的
  4. Ubuntu1804和2004高版本,右键无法创建TXT文档的解决办法【未完待续】
  5. python os.system 512_python os.system os.popen 区别
  6. html判断安装没安装qq,QQ6.1体验版怎么用?腾讯QQ6.1体验版本安装步骤(无须申请体验账号)...
  7. mysql查看表内容 很乱_mysql常用命令--15.10.14记录,内容有点乱
  8. html 图片变灰,科技常识:css使图片变灰的实现方法
  9. python多版本共存 ubuntu_Linux下python3与python3的多版本共存
  10. oracle awr 数据删除,Oracle AWR 删除历史快照 说明【转自dave偶像大神】