贪心算法

本质时求取局部最优解
以抓包问题为例
在既满足价值最高同时又质量最大的情况,采用贪心算法,其局部最优体现在每个物体的性价比最高
采用贪心算法,只能保证局部最优,只适合奔雷问题物体可以切割的情况
加入物体不可以分割,同时满足两个条件就得采用动态规划

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值