算法思维
贪心算法是用算法模拟一个“贪心”的人做出的决策,每一步都选取最优操作,不考虑造成的影响。
贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是问题能够分解成子问题来解决,子问题的最优解能递推到最终问题的最优解。
与动态规划的区别
贪心算法与动态规划的不同在于它对每个子问题的解决方案都做出选择,不能回退。动态规划则会保存以前的运算结果,并根据以前的结果对当前进行选择,有回退功能。
复杂度
空间复杂度:O(n)
时间复杂度:O(nlogn)
最常见的贪心有两种。
先按照所需排序,然后按顺序选择。
每次取其中最大/小的东西,并将其更新。
二者的区别在于一种是离线的,先处理后选择;一种是在线的,边处理边选择。
例题
题目来源:洛谷P2240
解题思路
算出每堆金币的性价比,并按其进行排序,每次拿走性价比最高的金币,直到背包装满为止。
题解
#include<bits/stdc++.h>
using namespace std;
struct node{
int a;
int b;
double value;
}a[200];
bool cmp(node x,node y)
{
return x.value>y.value;
}
int main()
{
int x,y;
cin>>x>>y;
for(int i=1;i<=x;i++)
{
scanf("%d %d",&a[i].a,&a[i].b);
a[i].value = (float)a[i].b/a[i].a;
}
sort(a+1,a+1+x,cmp);
float sum = 0;
for(int i=1;i<=x;i++)
{
if(a[i].a>y)
{
sum+=a[i].value*y;
break;
}
else
{
sum+=a[i].b;
y-=a[i].a;
}
}
printf("%.2f",sum);
return 0;
}