贪心算法---背包问题(力取最大价值)---阿里巴巴与四十大盗

#include<iostream>
#include<algorithm>
using namespace std;
const int M=1000005;

struct three{
	double w;//每个宝物的重量 
	double v;//每个宝物的价值 
	double p;//性价比 
}s[M];

bool cmp(three a,three b)
{
     return a.p>b.p;//指明按照宝物的性价比降序排序 
}

int main()
{
    int i,n;//n个宝物 
    double m,sum=0.0;//毛驴的承载能力m 
    cout<<"请输入宝物数量n及毛驴的承载能力m:"<<endl;
	cin>>n>>m;
	cout<<"请输入每个宝物的重量和价值,用空格分开:"<<endl;
	for(i=0;i<n;i++)
	{
	  cin>>s[i].w>>s[i].v;
	  s[i].p=s[i].v/s[i].w;//每个宝物的单位价值 
	} 
	sort(s,s+n,cmp);//参数cmp表示比较的类型 
	for(i=0;i<n;i++)//按照指标cmp排好的顺序贪心 
	{
		if(m>s[i].w)
		{
			m-=s[i].w;
			sum+=s[i].v;
		} 
		else
		{
			sum+=m*s[i].p;
			break;
		}
	} 
	cout<<"装入宝物的最大价值MAX="<<sum<<endl;
	return 0;
}

**物品可分割的装载问题我们称为背包问题,物品不可分割的装载问题我们称为0-1背包问题。0-1背包问题已不具有贪心选择性质,原问题的整体最优解无法通过一系列局部最优的选择得到,若采用贪心策略,只能得到该类问题最优解的近似解,而不是最优解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值