16.2-1
此处证明的思想是假设有一个最优解,然后可以由贪心算法得到此最优解。
设 S={1,2,...,n} S=\{1,2,...,n\} 个商品,并已经按平均价值从高到底排序,即 viwi≥vi+1wi+1 \frac{v_i}{w_i}\ge \frac{v_{i+1}}{w_{i+1}}。令 A A 是分数背包的一个最优解,并假定解里面也是按照平均价值从高到底排序。假设总重量和最优解的总价值分别是 W,VW,V。令 B B 是从 SS 中按照贪心算法求解得的解。
1) 总重量 W≤w1 W\le w_1:显然装入第一个商品得到最优解;
2) 总重量 W>w1 W> w_1:在 A A 中前几个商品加起来为 w1w_1 重的商品(这里的几个可能是一个,也可能是多个,还可能是某一个商品的其中一部分)。令 B=A−{A中第一个w1重的商品}+{第一个商品的w1的重量} B=A-\{A中第一个w_1重的商品\}+\{第一个商品的w_1的重量\}(即将 A A 中的 w1w_1 重的东西换成第一个商品的 w1 w_1 重量)。此时 A A 的价值 {第一个w1重量的价值}+{背包中剩余的价值}\{第一个w_1重量的价值\}+\{背包中剩余的价值\}。 B B 的价值是 {第一个商品的w1重量的价值)}+{背包中剩余的价值}\{第一个商品的w_1重量的价值)\}+\{背包中剩余的价值\}。由于 w1 w_1 的价值肯定是小于等于 v1 v_1(此商品全部装进去才有 v1 v_1 的价值)。因为 A A 是最优解,所以 {第一个w1重量的价值}=v1\{第一个w_1重量的价值\}=v_1(否则换了之后价值肯定提高, A A 就不是最优解,矛盾)。这样 AA 的价值就和 B B 的价值一样,而 AA 是最优的,则 B B 也是最优的。
然后递归求解问题,求解 SS 的 n−1 n-1 个商品,包最大重量为 W−w1 W-w_1。最后得到贪心算法的最优解。

附上分数背包的简单实现:

#include <iostream>
#include <algorithm>
using std::cout;
using std::endl;struct goods
{int weight;int value;goods():weight(0),value(0){}
};bool cmp(goods a,goods b)
{return a.value/a.weight > b.value/b.weight;
}int greedy(goods *array,int n,int weight)   //返回最终价值
{std::sort(array,array + n,cmp);int res = 0;for(int i = 0; i < n; i++){if(weight >= array[i].weight){res += array[i].value;weight -= array[i].weight;}else if(weight > 0){res += weight * (array[i].value / array[i].weight);weight = 0;break;}}return res;
}int main()
{int v[] = {60,100,120};int w[] = {10,20,30};goods ia[3];for(int i = 0; i < 3; i++){ia[i].value = v[i];ia[i].weight = w[i];}cout << "Value is " << greedy(ia,3,50) << endl;return 0;
}

16.2-2
根据书上所说,0-1背包具有最优子结构性质,若商品 i i 的重量大于剩余可装重量,我们将商品 ii 从方案中删除,否则解决方案是剩余商品重量不超过 W−wi W-w_i 的价值最高方案与不选商品 i i 且剩余重量不超过 WW 的价值最高方案的最大者。
记 c[i,w] c[i,w] 是商品 1,...,i 1,...,i 且重量是 w w 的解决方案价值,则:

c[i,w]=⎧⎩⎨0c[i−1,w]max(vi+c[i−1,w−wi],c[i−1,w])if i=0 or w=0if w_i>wif i>0 and w≥w_i

c[i,w]= \begin{cases} 0& \text{if i=0 or w=0}\\ c[i-1,w]& \text{if w_i>w}\\ \max (v_i+c[i-1,w-w_i],c[i-1,w]) & \text{if i>0 and w≥w_i} \end{cases}
算法输入是最大重量 W W,nn 个商品以及两个序列 v=[v1,v2,...,vn],w=[w1,w2,...,wn] v=[v_1,v_2,...,v_n],w=[w_1,w_2,...,w_n]

DYNAMIC-0-1-KNAPSACK(v,w,n,W)let c[0..n, 0..W] be a new arrayfor w = 0 to Wc[0,w] = 0for i = 1 to nc[i,0] = 0for w = 1 to Wif wi≤wif v_i + c[i-1,w-wi] > c[i-1,w]c[i,w] = v_i + c[i-1,w-wi] else c[i,w] = c[i-1,w]else c[i,w] = c[i-1,w]

时间复杂度是 Θ(nW) \Theta(nW)。

16.2-3
按照重量从低到高装入即可。设解决方案是 x=(x1,x2,...,xn) x=(x_1,x_2,...,x_n),且 w1≤w2≤...≤wn,v1≥v2≥...≥vn w_1\le w_2\le ...\le w_n,v_1\ge v_2\ge ...\ge v_n。令 j j 表示第一个没被装入的商品下标,所以 1..j−11..j-1 的商品全部装入, j...n j...n 的商品都没转入,现假设用 j...n j...n 的某个商品替换 1...j−1 1...j-1 中的某个商品,此时背包的价值下降且容量变小。

16.2-4
思想就是选择走最长的距离再补水,也就是说剩余的水不足以到达下一个补给点时就补水,否则就不补水。证明就略了。

16.2-5
算法如下:
1) 在点集中选取最小的点;
2) 取以该点为左起点的单位闭区间,然后从点集中去掉包含在该单位闭区间的所有点;
3) 重复1)-2),直到所有的点处理完毕;那么2)得到的单位闭区间集合A即为所求。

证明:首先,根据第二步肯定能得到一个解 A A,这个解包含所有的点。假设有一个最优解 BB。用以最小点为左起点的单位闭区间代替 B B 中包含该最小点的单位闭区间, 得到的新的解不会比 BB 更差,即 A A 也是最优解。

int interval(double *x,int n)//返回区间个数
{bool *isVisit = new bool[n];for(int i = 0; i < n; ++i)isVisit[i] = false;int res = 0;for(int i = 0; i < n; ++i){if(!isVisit[i]){isVisit[i] = true;++res;double max = x[i] + 1;for(int j = i + 1; j < n; ++j){if(x[j] > max)break;else isVisit[j] = true;}}}return res;
}

16.2-6
先求每个商品的平均价值 avgi=vi/wiavg_i = v_i/w_i,选择一个物品作为主元 m=avgm m = avg_m,对所有物品进行Paitition操作,时间是 O(n) O(n)。将平均价值 avg avg 分为三个集合 L={ai:avgi<m},E={ai:avgi=m},G={ai:avgi>m} L = \{a_i: avg_i m\}。分别对 G,E,L G, E, L 中元素求重量和得 SG,SE,SL SG, SE, SL。
1. 如果 W<SG W , 则令物体的集合为 O=G O = G,对集合 O O 递归进行上述过程。
2. 如果 SG≤W≤SG+SESG\le W \le SG+SE,则将集合 G G 中的元素都放入包中,并将集合 EE 总元素尽可能多的放入包中,结束。
3. 如果 SG+SE<W SG+SE , 将 G,E G,E 中元素放入包中。令物体集合 O=L O = L,总重 W=W−SG−SE W = W - SG - SE。递归进行上述过程。
每次递归都花费线性时间,子问题变成原来的一般规模,运行时间为 T(n)≤T(n/2)+Θ(n) T(n)\le T(n/2)+\Theta(n),得到 T(n)=O(n) T(n) = O(n)。

16.2-7
集合 A,B A,B 按照非递增的顺序排序即可。
证明:对于任意的下标 i<j i,考虑 abii,abjj a_i^{b_i},a_j^{b_j},我们要证明 abiiabjj≥abjiabij a_i^{b_i}a_j^{b_j}\ge a_i^{b_j}a_j^{b_i}。由于集合按照非递增顺序排列,所以 ai≥aj,bi≥bj a_i\ge a_j,b_i\ge b_j,又 ai,aj a_i,a_j 是正数且 bi−bj≥0 b_i-b_j\ge 0,得 abi−bji≥abi−bjj a_i^{b_i-b_j}\ge a_j^{b_i-b_j},两边同乘 abjiabjj a_i^{b_j}a_j^{b_j} 有 abiiabjj≥abjiabij a_i^{b_i}a_j^{b_j}\ge a_i^{b_j}a_j^{b_i}。

CLRS 16.2贪心算法的原理相关推荐

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

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

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

    建议先看看前言:http://www.wutianqi.com/?p=2298 连载总目录:http://www.wutianqi.com/?p=2403 说到贪心算法,避免不了于DP对比,所以前面的 ...

  3. 【数据结构与算法】之深入解析“贪心算法“的原理解析和算法实现

    一.简介 ① 贪心算法的基本概念 贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,它所做出的仅仅是在某种意义上的局部最优解,它是最自然智慧的算法. 贪心 ...

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

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

  5. 【算法学习】贪心算法

    参考算导第三版第16章 贪心算法 文章目录 1. 活动选择问题 1.1 活动选择问题的最优子结构 1.2 贪心选择 1.3 递归贪心算法 1.4 迭代贪心算法 2. 贪心算法原理 2.1 贪心选择性质 ...

  6. 活动安排问题的 动态规划和贪心算法

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  7. 从 活动选择问题 看动态规划和贪心算法的区别与联系

    这篇文章主要用来记录我对<算法导论> 贪心算法一章中的"活动选择问题"的动态规划求解和贪心算法求解 的思路和理解. 主要涉及到以下几个方面的内容: ①什么是活动选择问题 ...

  8. 公交调度-车次链编制贪心算法

    ---恢复内容开始--- 1 package cn.edu.karel.work.public_transit_problem; 2 3 import java.io.File; 4 import j ...

  9. 算法学习笔记22:贪心算法

    目录 贪心算法:如何用贪心算法实现Huffman压缩编码 如何理解"贪心算法" 贪心算法实战分析 1.分糖果 2. 钱币找零 3. 区间覆盖 解答开篇 内容小结 贪心算法:如何用贪 ...

最新文章

  1. HTSRealistic missions 10:Holy Word High School
  2. CVPR 2021 Oral|只用静态图像,就能实时渲染出丝滑3D效果
  3. vagrant学习笔记
  4. osg节点函数功能汇总
  5. 配置msf连接postgresql数据库
  6. GCC中常用的优化的参数
  7. runtime无法执行grep_如何使管道使用Runtime.exec()?
  8. MFC - CStdioFile 读取txt文件UNICODE 中文异常
  9. MQ学习(一)----JMS规范(转发整合)
  10. Spring框架从入门到精通
  11. 浅谈前端开发过程中使用的代理方法
  12. 力扣887题-鸡蛋掉落
  13. 2018春招总结(Java后端),干货满满
  14. Python绘图笔记
  15. java pdf输出图片_Java PDF转换成图片并输出给前台展示
  16. SAP 详细分析BOM物料清单
  17. jsp用Echarts做扇形图
  18. 汇编指令:MRS(读)和MSR(写)指令操作CPSR寄存器和SPSR寄存器使用
  19. 企业架构TOGAF介绍
  20. pythoot+mysql+基于Python的“书怡”在线书店系统的设计与实现 毕业设计-附源码082332

热门文章

  1. 数据管理平台系列之Zeppline安装与使用
  2. IOS 文件读写操作详解及简单实例
  3. StartActivity的2种用法
  4. 京东实习测开HR面(过)
  5. a与文件下载-(下载一)
  6. 视频播放过程中做视频问答(视频弹题功能)
  7. 回忆录——一份曾经面试“网易AI产品经理”的作品
  8. 《Android 应用 之路》一个类似今日头条的APP
  9. vue仿淘宝京东商品多条件筛选(vue实现)
  10. C语言的逻辑右移和算术右移