本质时求取局部最优解
以抓包问题为例
在既满足价值最高同时又质量最大的情况,采用贪心算法,其局部最优体现在每个物体的性价比最高
采用贪心算法,只能保证局部最优,只适合奔雷问题物体可以切割的情况
加入物体不可以分割,同时满足两个条件就得采用动态规划
#include<iostream>
#include<algorithm>
using namespace std;
//贪心算法适用于可分割的重物
//如果物体不可分割采用动态规划
struct bag
{
int w;
//重量
int v;
//价值
double c;
//性价比
}a[1001];
int main()
{
int cleft, b = 0, n, m, i, j = 0;
cin >> n;
for (i = 0; i < n; ++i)
{
cin >> a[i].w;
cin >> a[i].v;
a[i].c = a[i].w / a[i].v;
}
for (i = 0; i < n - 1; ++i)
{
//对物体的性价比进行降序排列,相当于求取局部最优解
if (a[i].c < a[i + 1].c) swap(a[i].c, a[i + 1].c);
}
cin >> m;
cleft = m;
while (j < n && a[j].w < cleft)
{
cleft -= a[j].w;
b += a[j].v;
j++;
}
if (j < n) b += 1.0 * a[j].v * cleft / a[i].w;
cout << b;
return 0;
}