前言
贪心算法是我个人比较喜欢的算法,简单有效,思路往往很容易想到,但是要证明其正确性比较麻烦。
一、思想
贪心的意思在于在作出选择时,每次都要选择对自身最为有利的结果,保证自身利益的最大化。贪心算法就是利用这种贪心思想而得出一种算法。对于一个较大的问题,通过一种贪心策略,把复杂的问题划分为多个小问题,并且找到每个子问题的最优解,以此来获得整个问题的最优解。也就是说贪心算法是一种在每一步选择中都采取在当前状态下最好的选择,从而希望得到结果也是是最好的算法。但是贪心算法并不是在所有问题上都能得到整体最优解,只是可以在相当广泛的问题上得到整体最优解或者整体最优解的近似。
二、解题步骤
- 制定一个贪心策略,想好如何划分子问题以及如何求解子问题(不同的贪心策略往往可以得到不同的答案,但通常只有一个策略对应着正确的答案)
- 划分子问题
- 求解子问题的最优解
- 将所有子问题的解合并成整体的解
三、例题
1.圣诞老人的礼物
描述
圣诞节来临了,在城市A中圣诞老人准备分发糖果,现在有多箱不同的糖果,每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿最多只能承受一定重量的糖果,请问圣诞老人最多能带走多大价值的糖果。
输入
第一行由两个部分组成,分别为糖果箱数正整数n(1 <= n <= 100),驯鹿能承受的最大重量正整数w(0 < w < 10000),两个数用空格隔开。其余n行每行对应一箱糖果,由两部分组成,分别为一箱糖果的价值正整数v和重量正整数w,中间用空格隔开。
输出
输出圣诞老人能带走的糖果的最大总价值,保留1位小数。输出为一行,以换行符结束。
样例输入
4 15
100 4
412 8
266 7
591 2
样例输出
1193.0
解题思路
计算每箱糖果的价值/重量比,并且每次都先选最大的(贪心策略),对价值重量比大的糖果尽可能多装,装完了再退而求其次装第二大的,以此类推。
示例代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
const double eps = 1e-6; //足够小,可以看作是0
struct Candy
{
int v; //价值
int w; //重量
bool operator < (const Candy& c) const
{
//运算符重载,将用于下面的sort函数中
return double

本文介绍了贪心算法的基本思想,解题步骤,并通过圣诞老人分糖果和电影节选电影两个例题展示了贪心策略的应用。文章指出贪心算法在某些问题上能获得最优解,但并非所有情况都适用。
最低0.47元/天 解锁文章
1088

被折叠的 条评论
为什么被折叠?



