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

#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背包问题已不具有贪心选择性质,原问题的整体最优解无法通过一系列局部最优的选择得到,若采用贪心策略,只能得到该类问题最优解的近似解,而不是最优解。

发布了106 篇原创文章 · 获赞 53 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/104033714