精华内容
下载资源
问答
  • 贪心算法最优解

    2011-12-09 16:12:03
    贪心算法最优解
  • 贪心算法(Gre小编开始自学,开始理解与学习算法,如果内容有误,欢迎大家评论,互动。 贪心算法(Greedy): 一:求解优化问题(最多,最少等) 解题步骤: 1,遍历备选元素 2,制定贪心策略选择一个元素 贪心策略...

    小编开始自学,开始理解与学习算法,如果内容有误,欢迎大家评论,互动。

    贪心算法(Gre小编开始自学,开始理解与学习算法,如果内容有误,欢迎大家评论,互动。
    贪心算法(Greedy):
    一:求解优化问题(最多,最少等)
    解题步骤:
    1,遍历备选元素(进行排序)
    2,制定贪心策略选择一个元素
    贪心策略(从目标中选择一个元素,进行求解,一次循环,找到答案,目标集合减少,求解集合越来越多,剩余元素状态可能不变,可能改变):具有一致性,多样性。

    练习:
    一:硬币找零

    def grt_main(a):
        coins=[1,5,10,25,100]#制定硬币值
        result=[]#存储结果
        s_coins=sorted(coins,reverse=True)#进行从大到小排序
        for i in s_coins :
            #求硬币个数
            num_coin=int(a/i)
            result += [i]*num_coin
            #剩下的数值
            a=a-i*num_coin
            if a <= 0 :
                break
        return result
    
    if __name__ == '__main__':
        print(grt_main(36))
    

    现象:
    在这里插入图片描述
    二:有一个贼在偷取一家商店时,发现n个物品,第i个物品价值v元,重w磅,他希望带走东西越多越好,但背包中只能装下w磅东西,(v,w为整数)
    应该带走那几样东西?w=4kg
    (琴 2kg 4100 :手机 1kg 2000 :电视 3kg 6000元 :玩具 2kg 2100 :书 0.2kg 800)

    def grt():
        coins=[
            [2,4100],[1,200],[3,6000],
            [1,2100],[0.2,800]
        ]#制定物价
        bag=4#包存储能力
        bag1=[]
        many = 0 #获取总价值
        for i in range(len(coins)):
            price =  coins[i][1] / coins[i][0]
            coins[i].append(price)
        coins.sort(key=lambda coins : coins[2],reverse=True)#按性价比进行比较排序
        for data in coins :
    
            if data[1] <= bag :
    
                many += data[1]
                bag -= data[0]
    
            else:
                many += data[2]*bag #获取一部分
                bag1.append(data[0])
                break
        return many,bag1
    print("价值:",grt())
    

    在这里插入图片描述

    任务规划
    1,对元素进行排序
    2,从任务集合中选择出满足条件的任务加入到目标集合(删除所以与目标冲突的集合。
    3,从任务集合中选择结束时间最早的加入目标集合(直到任务集合为0)

    展开全文
  • 贪心算法最优解条件

    千次阅读 2020-05-14 22:29:36
    条件 证明每次的局部最优解必须在全局最优解序列中,否则不可能到达全局最优

    最优子结构条件

    • 证明每次的局部最优解必须在全局最优解序列中,否则不可能到达全局最优
      局部最优选择策略的选择很重要
    展开全文
  • 贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择 2.应用: 平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用...

    1.概念:

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,算法得到的是在某种意义上的局部最优解。贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择

    2.应用:

    平时购物找零钱时,为使找回的零钱的硬币数最少,不要求找零钱的所有方案,而是从最大面值的币种开始,按递减的顺序考虑各面额,先尽量用大面值的面额,当不足大面值时才去考虑下一个较小面值,这就是贪心算法

    3.存在局部最优问题的体现:

    找零钱时,如果零钱面额是【1,5,10】,仿佛没问题
    但如果是【1,5,11】,要找钱的金额是15元时
    按照贪心算法的思想,从最大金额开始遍历,找钱方案是11+1+1+1+1 = 15,一共五张纸币
    但实际情况是,用5 + 5 + 5 = 15的找钱方案才是最优的
    猜测是因为10不是质数的原因,具体原因未知
    用动态规划则没有这个问题
    在这里插入图片描述

    4.代码

    import java.util.*;
    class Main{
    	public static int tanxin(int[] coins, int sum){
    		Arrays.sort(coins);
    		int ans = 0;
    		for(int i = coins.length - 1; i >= 0; i--){
    			if(sum >= coins[i]){
    				int num = sum/coins[i];
    				sum = sum - num * coins[i];
    				ans += num;
    				System.out.println("换" + coins[i] + "元零钱" + num + "张");
    				if(sum == 0){
    					break;
    				}
    			}
    		}
    		return ans;
    	}
    	
    	public static int dynamicPlan(int[] coins, int sum){
    		Arrays.sort(coins);
    		int[] dp = new int[sum + 1];
    		Arrays.fill(dp,sum + 1);//要赋初值
    		dp[0] = 0;
    		for(int i = 1; i < dp.length; i++){
    			for(int j = 0; j < coins.length; j++){
    				if(i - coins[j] >= 0){
    					dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1);
    				}
    			}
    		}
    		return dp[sum];
    	}
    	
    	public static void main(String[] args){
    		int[] coins = {1,5,10};
    		int[] coins1 = {1,5,11};
    		int sum = 15;
    		System.out.println("使用贪心算法,最终换零钱张数为:" + tanxin(coins1,sum));//存在局部最优问题
    		System.out.println("使用动态规划算法,最终换零钱张数为:" + dynamicPlan(coins1,sum));
    	}
    }
    
    展开全文
  • 贪心算法一定能得到最优解的证明 按照老师说法是 分为三步: 证明总存在一个以贪心选择开始的最优解。 此问题具有最优子结构的性质。 用数学归纳法,总结得到结论。 以活动安排为例,首先,我们按照按照活动结束...

    贪心算法一定能得到最优解的证明

    按照老师说法是 分为三步:

    1. 证明总存在一个以贪心选择开始的最优解。
    2. 此问题具有最优子结构的性质。
    3. 用数学归纳法,总结得到结论。

    以活动安排为例,比赛问题首先,我们按照按照活动结束时间非递增排序,即从小到大得到一个序列 E{1、2、…、n),我们可以知道1这个活动是一定会被选到的,因为他的结束时间最早,我们可以有更多的时间去观看其他比赛。

    假设具有一个最优解A,且A中的活动安排也是按照活动的结束时间非递增排序,即从小到大排序的,且他的第一个活动为K,这时候我们就需要重点比较K1的关系了;
    如果K = 1:我们就可以知道A就是满足以贪心选择开始的一个最优解,所以证明的结束了;这个就满足了第一个要求;
    如果K != 1:我们就需要设一个解为B,这个B不包含A中的K这个活动,但是他包含A中的其他活动,且他的第一个第一个活动为E中的1,我们可以想象,这个是求解最多能够观看多少场比赛的问题,所以,由E的排序可知,活动1的结束时间比活动K的结束时间还要早,所以我们可以知道B也是一个最优解,且是一个由贪心选择开始的最优解,因为他们能观看的比赛场次都是相同的,都达到了最大值。得证第一个要求;

    二、最优子结构的问题

    在做了第一步贪心选择活动1之后,原问题简化为了,对E中所有与活动1相容的活动进行安排的子问题,用通俗的话说,就是现在1已经确定了,然后我们就需要对剩下的活动进行安排,但是这些安排有一个前提,就是他们的开始时间,大于等于1的结束时间。
    所以,若A是原问题的最优解,则设A’=A-{1} 是接下来的子问题的最优解,也就是活动开始时间>1活动的结束时间的剩余的活动,设为E’,的最优解, 这时候我们可以用反证法,假设E’有一个解B’B’A’包含更多的活动,则B=B’+{1},则容易知道B比最优解A还要包含更多的活动,与A的最优性矛盾,所以不存在这样一个B’,也就是得到
    结论:每一次所做的贪心选择都将原问题简化为与原问题具有相同形式的子问题,得证,活动安排问题,具有最优子结构的性质。

    三、用数学归纳法

    通过数学归纳法可知,贪心选择算法最终产生原问题的最优解

    PS:个人理解,且具体问题还需要具体分析。

    展开全文
  • 搜索最优解算法之贪心算法

    万次阅读 2016-05-03 21:21:21
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。[1]  贪婪算法可解决的问题通常大部分都
  • 最近在看《编程之美》这本书,在讲到书的折扣问题的时候想了一个问题:当每一步都是最优解的时候为什么总体却不是最优解,也就是说如何判断贪心算法是不是最优解? 子问题最优->整体最优 和动态规划之间的问题---...
  • 贪心算法汽车加油问题 贪心算法基本思想 贪心算法总是做出在当前看来是最好的选择并不会从总体去最优考虑虽然贪心算法不会对所有问题找到最优但是有时候会得到最优解的近似解 贪心算法的基本要素 1贪心选择性质指所...
  • 主要介绍了Python基于贪心算法解决背包问题,简单描述了贪心算法的概念、原理并结合实例形式分析了Python使用贪心算法解决背包问题的具体操作技巧,需要的朋友可以参考下
  • 贪心算法最优解

    千次阅读 2015-01-31 20:08:23
    题目:有 m 元钱,n 种物品;每种物品有 j 磅,总价值 f 元,可以 ...算法思想:,每次都买性价比最高的产品,性价比的计算公式为(重量\价格),性价比的含义为用最少的钱买到最多的东西 #include #include #inclu
  • 首先我们先代入问题来认识一下贪心算法涉及的问题 找钱问题 给顾客找钱,希望找零的钞票尽可能少,零钱种类和数量限定 找钱问题满足最优子结构 ...设相容集 A 是一个最优解,其结束最早的活动为 a,则
  • 虽然贪心算法不能对所有问题都得到整体最优解,但对许多问题它能产生整体最优解。如单源最短路经问题,最小生成树问题等。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似。
  • 贪心算法

    千次阅读 多人点赞 2019-04-07 15:16:00
    也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解贪心算法解决问题 (1)你有n堆石头质量分别为W1,W2,W3…Wn.(n)现在需要你将两堆石头合并,问一共所用力量最小是多少? 例如: n=4; ...
  • 贪心解的选择策略 我们定义贪心解的选择策略如下: 首先,不失一般性,我们忽略掉所有单个体积大于背包容积的物品,这些物品是一定不会被选中的。 再将所有物品按照单位价值由大到小排序,分别为itemitemitem1,...
  • * method: 贪心法(非最优解) * date: 2020/05/12 */ #include<iostream> using namespace std; const int MAX_N=20; int arc[MAX_N][MAX_N]= { {0,1,0,0,0}, {1,0,1,1,0}, {0,1,0,0,1}, {0,1,0,0,1}, {...
  • 贪心算法 code

    2017-11-14 11:05:56
    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解
  • 如果使用贪心算法求解,第一艘船装载的方式只可能有一种最优解,就是装载的物品都是以从轻到重的顺序装载,所能装的最大重量,那么问题就来了,从轻到重这样装,不一定是最满的。比如{10,20},c1=20,根据贪心算法...
  • python 贪心算法的实现

    2020-12-16 22:01:14
    贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。 基本思路 思想 贪心算法的基本思路是从问题的某...
  • 文章目录基本知识回顾如何证明问题具有贪心选择性质样例一:活动安排问题...这也是贪心算法对于最优解问题可行的基本要素,是贪心算法区别于动态规划算法的主要区别 如果要使用贪心算法,一定要证明由算法所得到的解是
  • 贪心算法(又称贪婪算法)是指,在对问题求解时,...贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择,选择的贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关
  • 贪心算法-背包问题

    2019-09-21 18:26:13
    贪心算法的特点:就是按照最优解解决实际问题贪心算法在每一步的选择中,都选择当时最佳的情况。即局部最优的选择。贪心算法并不能保证总能得到最优解,但是很多问题确实可以求得最优解 心得:本次实验自己亲自通过...
  • c语言贪心算法

    2014-02-21 10:22:44
    c语言的贪心算法,有背包问题等,附源代码,一份实验报告
  • 贪心算法解背包问题

    万次阅读 多人点赞 2019-05-19 11:09:11
    辨析: 背包问题能用贪心算法求解,但是01背包问题不能用贪心算法求解(因为01背包问题不具备贪心选择性质----通过局部最优,达不到全局...50,p=160,但这并不是最优解,事实上(20+30)=50,p=100+120=220.才是问题的...
  • 贪心算法举例详解

    2020-02-21 22:37:48
    什么是贪心算法 其实我个人觉得贪心算法还是很...2)贪婪算法所得到的结果不一定是最优的结果(有时候会是最优解),但是都是相对近似(接近)最优解的结果 贪心算法的应用-集合覆盖 可能介绍了贪心算法的定义,大家不是...
  • 2:最优子结构性质:某个问题的整体最优解包含了“子”问题的最优解。完整的代码如下: 代码如下:#include “iostream”using namespace std;struct goodinfo{ float p; //物品效益 float w; //物品重量 float X;...
  • 顾名思义贪心算法总是作出在当前看来最好的选择也就是说贪心算法并不从整体最优考虑它所作出的选择只是在某种意义上的局部最优选择当然希望贪心...情况下即使贪心算法不能得到整体最优解其最终结果却是最优解的很好近似...
  • 输入:第1行输入机器数量m,作业...输出:n个作业全部加工处理完成所需最短时间的近似最优值。例: 17 源代码: #include #include #include #include   using namespace std;   int cmp(int x,i
  • 思想很简单的贪心 贪心算法是在每一步选择中都采取当前最好的或者...但是有些问题,如果每次都是选择局部最优解,有可能最终结果不是最优解 如有这样一个数塔,一个人可以从一个格子移动到和它相邻的2个格子,从塔顶.
  • 文章结构 如何理解贪心算法 贪心算法实例分析 使用贪心算法实现哈夫曼编码 源码地址 说明 ...贪心算法的思想是:每次都做出当前最优的选择,通过多步选择得出最终的最优解。它适合解决上一步的选择不
  • 贪心算法求解最优服务次序问题,有具体的算法分析,贪心性质的证明,优子结构的证明,及源代码

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 21,385
精华内容 8,554
关键字:

最优解贪心算法