请问数钱的贪婪算法怎样确保得到最优解?

作者&投稿:郯试 (若有异议请与网页底部的电邮联系)
贪心算法的例题分析~



贪婪算法:总是作出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解。
(注:贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解。但其解必然是最优解的很好近似解。

基本思路:——从问题的某一个初始解出发逐步逼近给定的目标,以尽可能快的地求得更好的解。当达到某算法中的某一步不能再继续前进时,算法停止

实现该算法的过程:
从问题的某一初始解出发;
while 能朝给定总目标前进一步 do
求出可行解的一个解元素;
由所有解元素组合成问题的一个可行解;

基本要素:
1、 贪婪选择性质:所求问题的整体最优解可以通过一系列局部最优的选择,即贪婪选择来达到。(与动态规划的主要区别)
采用自顶向下,以迭代的方式作出相继的贪婪选择,每作一次贪婪选择就将所求问题简化为一个规模更小的子问题。
对于一个具体问题,要确定它是否具有贪婪选择的性质,我们必须证明每一步所作的贪婪选择最终导致问题的最优解。通常可以首先证明问题的一个整体最优解,是从贪婪选择开始的,而且作了贪婪选择后,原问题简化为一个规模更小的类似子问题。然后,用数学归纳法证明,通过每一步作贪婪选择,最终可得到问题的一个整体最优解。
2、最优子结构性质:包含子问题的最优解
1、 设有n个活动的安排,其中每个活动都要求使用同一资源,如演讲会场,而在同一时间只允许一个活动使用这一资源。每个活动都有使用的起始时间和结束时间。问:如何安排可以使这间会场的使用率最高。
活动 起始时间 结束时间
1 1 4
2 3 5
3 0 6
4 5 7
5 3 8
6 5 9
7 6 10
8 8 11
9 8 12
10 2 13
11 12 14

算法:一开始选择活动1,然后依次检查活动一i是否与当前已选择的所有活动相容,若相容则活动加入到已选择的活动集合中,否则不选择活动i,而继续检查下一活动的相容性。即:活动i的开始时间不早于最近加入的活动j的结束时间。
Prodedure plan;
Begin
n:=length[e];
a {1};
j:=1;
for i:=2 to n do
if s[i]>=f[j] then
begin a a∪{i};
j:=i;
end
end;

例1 [找零钱] 一个小孩买了价值少于1美元的糖,并将1美元的钱交给售货员。售货员希望用数目最少的硬币找给小孩。假设提供了数目不限的面值为2 5美分、1 0美分、5美分、及1美分的硬币。售货员分步骤组成要找的零钱数,每次加入一个硬币。选择硬币时所采用的贪婪准则如下:每一次选择应使零钱数尽量增大。为保证解法的可行性(即:所给的零钱等于要找的零钱数),所选择的硬币不应使零钱总数超过最终所需的数目。

假设需要找给小孩6 7美分,首先入选的是两枚2 5美分的硬币,第三枚入选的不能是2 5美分的硬币,否则硬币的选择将不可行(零钱总数超过6 7美分),第三枚应选择1 0美分的硬币,然后是5美分的,最后加入两个1美分的硬币。

贪婪算法有种直觉的倾向,在找零钱时,直觉告诉我们应使找出的硬币数目最少(至少是接近最少的数目)。可以证明采用上述贪婪算法找零钱时所用的硬币数目的确最少(见练习1)。


牛人数学家中彩票14次,发明选号算法,他后来怎么样了?
他还真就研究出了一种算法,靠着这个算法,成功降低了排列组合的难度,他能提前确定开奖中大部分的几位数字。并声称这个算法能够能精准预测6位数字中的5位,大大提高中奖的概率。剩下的自己推算就可以了,他也在实战中取得了成功,第一次就获得了2万美元的奖金。品尝到甜头后,曼德尔就开始了疯狂的...

...钱买100只鸡共有多少种方案”类似问题较好的算法设计方法是...
解决用100元钱买100只鸡共有多少种方案类似问题较好的算法设计方法是穷举法。穷举法的基本思想是根据题目的部分条件确定答案的大致范围,并在此范围内对所有可能的情况逐一验证,直到全部情况验证完毕。若某个情况验证符合题目的全部条件,则为本问题的一个解;若全部情况验证后都不符合题目的全部条件,则本...

我手里有50元钱 花完之后 每次剩余钱的总数怎么多1元
你那样算的问题在于,第一个30是独立的,但第二个余额15和第三个余额6都是包含在30里面的,所以是不能把三个数直接相加的。解决方案2:这个相等的机会很少,如果最后一次是买10元的东西就可相等,但是如果你一开始就买45元的东西,那只有剩5元了。这样怎么也不可能买东西的钱和剩余的钱相等 解决...

求利润算法,比如我成本是4元想有百分之30的利润我售价应该是多少,求...
二年级数学教材中,“三个小朋友见面握手,每两人握一次,共要握几次手”与“用三张不同的数字卡片摆成两位数,共可以摆成多少个两位数”。像这样的有关排列、组合的知识,在小学教学中,如果实物演示的方法,是很难达到预期的教学目标的。特别是一些数学概念,如果没有实物演示,小学生就不能真正...

c语言 找零钱问题,谢谢
这很容易。先输入n值,然后从最大面值的人民币开始减。例如:我有238元 减最大面值的第一个。238-100=138。结果为正数且不为零。然后记录100元张数的变量加1(这些变量都应初始化时为0)继续,138-100=38.结果正数且不为零,同上100面值变量加1,38-100。结果小于零。不再用100面值的减。

数学题,,
“一队强盗一队狗,二队并作一队走,数头一共三百六,数腿一共八百九,问有多少强盗多少狗?”这道题和《孙子算经》中的“鸡兔同笼”是同一种类型题,只不过,把鸡换成强盗,把兔换成狗就是了,具体算法是(360×4-890)÷(4-2)=275360-275=85强盗有275人,狗有85条。还有首中国民谣:“几个老头去赶集,...

买一个娃娃和一个小熊要花多少钱,买一俩汽车和一盒积木能节省10元钱...
小结:这道题迷惑人主要是它把那 2 元钱从 27 元钱当中分离了出来,原题的算法错误的认为 服务员私自留下的 2 元不包含在 27 元当中,所以也就有了少 1 元钱的错误结果; 而实际上私 自留下的 2 元钱就包含在这 27 元当中,再加上退回的 3 元钱,结果正好是 30 元。 2、【题目】有个人去买葱 问...

求利润算法,比如我成本是4元想有百分之30的利润我售价应该是多少,求...
成本是4元,想有百分之30的利润 售价应该是(5.2元)4+4*30 =4+4*0.3 =4+1.2 =5.2(元)扣除营业税金及附加后得到营业利润。营业利润乘以所得税税率,计算出所得税费用。只有先得出营业利润,才能计算出所得税费用,才能得出净利润。所得税费用并不是一开始就知道的。因此必须分别扣。

用中学数学公式中了14次彩票头奖,曼德尔究竟用的什么公式?
之后他写了一个“数字挑选算法”,可以从六个中奖号码中,算出可能中奖的5个。自此他就开始购买大量的彩票,让自己获得成功。2、彩票的漏洞 我们都知道现在彩票的规则,就算我们把所有的彩票都买了,中奖的钱可能还没有彩票钱多。可是在当时不一样,曼德尔利用第一桶金完成了移民,在澳大利亚...

C语言 百钱买百鸡
include<stdio.h> void main(){ int a,b,c;for(a=0;a<20;a++) \/\/公鸡可能的只数 for(b=0;b<(100-5*a)\/3;b++) \/\/母鸡可能的只数 { c=100-a-b; \/\/总数为100时,小鸡的只数 if(c%3==0 && a*5+b*3+c\/3==100) \/\/若小鸡只数是3的倍数,且总价为100...

云梦县19821831473: 请问数钱的贪婪算法怎样确保得到最优解? -
倚朱联邦: 贪婪算法:总是作出在当前看来是最好的选择.也就是说,不从整体最优上加以考虑,它所做出的仅是在某种意义上的局部最优解. (注:贪婪算法不是对所有问题都能得到整体最优解,但对范围相当广泛的许多问题它能产生整体最优解.但其...

云梦县19821831473: 贪心算法中,通常会让证明贪心选择性,请问,证明贪心选择性的实质是什么?怎样说明一个问题具有贪心选择呢 -
倚朱联邦: 贪心选择性质:所求问题的整体最优解可以通过一系列局部最优的选择来得到.就是说,你需要证明当前问题可以通过选择最好的那个元素(比如01背包,总能够通过选择当前重量最小的物品来得到最优解)来解决问题 证明:(每一步所做的贪心选择最终导致问题的整体最优解)//基本思路:考察一个问题的最优解,证明可修改该最优解,使得其从贪心选择开始,然后用数学归纳法证明每一步都可以通过贪心选择得到最优解1,假定首选元素不是贪心选择所要的元素,证明将首元素替换成贪心选择所需元素,依然得到最优解;2,数学归纳法证明每一步均可通过贪心选择得到最优解

云梦县19821831473: 举例说明,动态规划和贪心算法的区别 -
倚朱联邦: 贪心算法是种策略,思想...它并没有固定的模式比如最简单的背包问题用贪心的思想去做,就可能有很多种方法性价比最高的、价值最高的、重量最轻的而你没法确保你所选择的贪心策略对所有的情况都是绝对最优的动态规划的思想是分治+解决

云梦县19821831473: C语言用下面贪婪算法如何编程实现有3种硬币,面值分别1元,5角和1角.这3种硬币各种数量不限给一位顾客找2元7角,请问如何才能使找出的硬币个数最少... -
倚朱联邦:[答案] #include int little(double n){static int i=0;if(n==0.0){return;}else{if(n>=1.0){ ++i;printf("n=%f\n",(n-1));little(n-1.0);}else if(n>=0.5){ ++i;printf("n=%f\n",(n-0.5));little(n-0.5);}e...

云梦县19821831473: 求一个算法(贪心算法) -
倚朱联邦: 首先,无所谓哪里密集哪里不密集的说法,这是人为的区分,需要首先遍历全部格子才能确定,是最慢的算法,全部遍历过了就可以得出最优的路线了.既然用贪心算法,为了思考方便,可以假设棋盘无穷大,算法的目的是判断下一步该往右走还...

云梦县19821831473: 贪心算法部分背包问题怎么办?
倚朱联邦: 对每件物品,以价值排序,每回优先选取价值大的,若物品选光则选次大的,直到背包装不下.证明:对第i件物品,若它是当前能选的物品中价值最大的,则选一公斤的该物品总比选一公斤的其他物品价值大.若你选取了一公斤价值为V1的物品,剩下了一公斤价值为V2的物品,而V2>V1,则只需要将两物品交换则能构造出1个更优的解,由此可知,上述的贪心是正确的.

云梦县19821831473: 罗马尼亚度假问题,不会啊,求代码 -
倚朱联邦: 一、问题描述(1)罗马尼亚问题:Find Bucharest starting at Arad分别用宽度优先、深度优先、贪婪算法和A*算法求解“罗马利亚度假问题”.要求:分别用文件存储地图和启发函数表,用生成节点数比较几种算法在问题求解时的效率,列表给...

云梦县19821831473: C语言用下面贪婪算法如何编程实现 -
倚朱联邦: #include <stdio.h> #include <stdlib.h>int little(double n){ static int i=0; if(n==0.0){ return; }else{ if(n>=1.0){++i; printf("n=%f\n",(n-1)); little(n-1.0); }else if(n>=0.5){++i; printf("n=%f\n",(n-0.5)); little(n-0.5); }else if(n>=0.1){++i; printf("n=%f\n",(...

云梦县19821831473: 怎样用Python实现贪心算法 -
倚朱联邦: 题目:圣诞节来临了,在城市A中,圣诞老人准备分发糖果.现在有多箱不同的糖果,每一种糖果都有自己的价值和重量.每箱糖果都可以拆分成任意散装组合带走.圣诞老人的驯鹿最多只能承受一定重量的糖果.请问圣诞老人最多能带走多大...

云梦县19821831473: VB用贪婪算法实现 -
倚朱联邦: '窗体上一个文本框text1控件,用于输入找补的金额'一个按钮command1 Private Sub Command1_Click() Dim a(1 To 3) '把硬币的币值存入数组中以分为单位,100,50,10 Dim b(1 To 3) '用于记录硬币的个数 Dim c(1 To 3) '用于记录硬币的名称 a(1) ...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网