贪心算法的定义
贪心算法是指,在对问题求解时,总是做出在当前看来是最好的选择。 也就是说,不从整体最优上加以考虑,它所做出的仅是在你所选择的贪心准则上的局部最优解,从而推出整体的最优解。
所谓贪心准则,就是我们平常说的对于这道题我们应该怎么贪。
应用贪心算法解决的一些问题
背包问题 给定一个载重量为M的背包,考虑n个物品,其中第i个物品的重量 ,价值wi (1≤i≤n),要求把物品装满背包,且使背包内的物品价值最大。 或
金银岛问题 某天KID利用飞行器飞到了一个金银岛上,上面有许多珍贵的金属,KID虽然更喜欢各种宝石的艺术品,可是也不拒绝这样珍贵的金属。但是他只带着一个口袋,口袋至多只能装重量为w的物品。岛上金属有s个种类, 每种金属重量不同,分别为n1, n2, … , ns,同时每个种类的金属总的价值也不同,分别为v1,v2, …, vs。KID想一次带走价值尽可能多的金属,问他最多能带走价值多少的金属。注意到金属是可以被任意分割的,并且金属的价值和其重量成正比。 思路分析 我认为这两个问题是差不多的,都是选择高性价比的东西来把背包填满即可。及他们的贪心准则都是从性价比高的开始贪。
金银岛代码
#include <iostream>
#include <iomanip>
#include <algorithm>
using namespace std;
struct j
{ int n,v;
double jz;
}a[1000];
bool cmp(j x,j y)
{
if(x.jz!=y.jz)
return x.jz>y.jz;
else
return x.n>y.n;
}
int main()
{
int k,w,s;
cin>>k;
while(k--)
{
double sum=0;
cin>>w>>s;
for(int i=0;i<s;i++)
{
cin>>a[i].n>>a[i].v;
a[i].jz=1.0*a[i].v/a[i].n;
}
sort(a,a+s,cmp);
for(int i=0;i<s;i++)
{
if(a[i].n>=w)
{
sum+=w*a[i].jz;
break;
}
else
{
sum+=a[i].v;
w-=a[i].n;
}
}
printf("%.2lf\n",sum);
}
}
书架问题 John共有N头奶牛(1 ≤ N ≤ 20,000),每头奶牛有自己的高度Hi(1 ≤ Hi ≤ 10,000),N头奶牛的总高度为S。书架高度为B(1 ≤ B ≤ S < 2,000,000,007). 为了到达书架顶层,奶牛可以踩着其他奶牛的背,像叠罗汉一样,直到他们的总高度不低于书架高度。当然若奶牛越多则危险性越大。为了帮助John到达书架顶层,找出使用奶牛数目最少的解决方案吧。 思路分析 只需要选择个子从高到低的奶牛排序即可。
#include< iostream>
#include< bits/ stdc++ . h>
using namespace std;
bool cmp ( int x, int y)
{
return x> y;
}
int main ( )
{
int a[ 100100 ] ;
int n, b, hi= 0 ;
int i;
cin >> n>> b;
for ( i= 0 ; i< n; i++ )
{
cin >> a[ i] ;
}