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