贪心算法

本是古典 何须时尚 2022-06-06 03:11 388阅读 0赞

贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。举一个简单的贪心法例子,平时购物找钱时,为使找回的零钱的硬币数最少,从最大面值的币种开始,按递减的顺序考虑各币种,先尽量用大面值的币种,当不足大面值币种的金额时才去考虑下一种较小面值的币种,这就是在采用贪心法。需要注意的是,贪心法并不总能得到最优解。

贪心法求得最优解的问题中一般具有两个重要的性质:

(1)最优子结构:当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构。问题具有最优子结构是该问题可以采用动态规划法或贪心法求解的关键性质。

(2)贪心选择性质:指问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来得到。

以部分背包问题为例:

假设物品个数n=5,背包容量W=100,物品的基本信息如下图:

20171028173844502

为了得到最优解,必须把背包装满,现在用贪心策略求解,首先要选出度量的标准。

假设按照最大单位重量价值先放背包的原则。

C#代码实现如下:

  1. private void btnOK_Click(object sender, EventArgs e)
  2. {
  3. int i;
  4. int n = 5; //物品数量
  5. //已经按照单位重量价值进行排序:
  6. double []weight={30,10,20,50,40};
  7. double []v={65,20,30,60,40};
  8. double W=100;
  9. double [] x = new double [5];
  10. for (i = 0; i < n; i++)
  11. {
  12. if (weight[i] <= W) //如果背包剩余容量可以装下该物品
  13. {
  14. x[i] = 1;
  15. W = W - weight[i];
  16. }
  17. else
  18. {
  19. break;
  20. }
  21. }
  22. if (i < n) //如果还有物品可以部分装入背包中
  23. {
  24. x[i] = W / weight[i];
  25. }
  26. double sum = 0; //最大价值
  27. for (i = 0; i < n; i++)
  28. {
  29. textBox1.Text = textBox1.Text +" "+x[i].ToString();
  30. sum = sum + x[i] * v[i];
  31. }
  32. textBox2.Text = sum.ToString();
  33. }

感谢您的阅读~

发表评论

表情:
评论列表 (有 0 条评论,388人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法

    贪心算法也称贪婪算法,其核心思想就是:每步都采用最优的做法。        贪心算法所得到的结果往往不是最优的结果(有时候是最优解),但都是相对接近最优解的。       

    相关 贪心算法

    一:贪心算法介绍 1. 贪婪算法(贪心算法)是指在对问题进行求解时,在每一步选择中都采取最好或者最优(即最有利)的选择,从而希望能够导致结果是最好或者最优的算法。 2.

    相关 贪心算法

    贪心算法的基本要素 对于一个具体的问题,怎么知道是否可用贪心算法解此问题,以及能否得到问题的最优解呢?这个问题很难给予肯定的回答。 但是,从许多可以用贪心算法求解的问题

    相关 贪心算法

    贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所做出的是在某种意义上的局部最优解。举一个简单的贪心法例子,平时

    相关 贪心算法

    1.钞票支付问题,1元,2元,5元,10元,20元,50元,100元钞票无穷张,使用这些钞票怎么支付,最少需要多少张。 思路:尽可能使用面额较大的金额数目。反证法:若不成立,

    相关 贪心算法

    一、什么是贪心算法 贪心算法,又称贪婪算法(Greedy Algorithm),是指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优解出发来考虑,它

    相关 贪心算法

    一 问题提出 集合覆盖问题 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号。 ![watermark