贪心算法--部分背包问题
描述:
有n个物体,第i的物体的重量为wi,价值为vi,在重量不超过c的情况下让总价尽量的高,每一个物体可以支取一部分,价值和重量按比例计算
思路:
算出每个物体的单位价值(v/w),然后从大到小选择物品进行装包,由于物品可以部分装入,所以装完后背包的重量一定为c。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int w,v;
double a;
};
int cmp(node m,node n)
{
return m.a>n.a;
}
int main()
{
int n,c;
node p[1000];
cin>>n;
for(int i=0;i<n;i++)
{
cin>>p[i].w;
cin>>p[i].v;
p[i].a = 1.0*p[i].v / p[i].w;
}
sort(p,p+n,cmp);
cin>>c;
double sum = 0;
for(int i=0;i<n;i++)
{
if(c > p[i].w)
{
sum += p[i].v;
c = c - p[i].w;
}
else
{
sum += p[i].a * c;
break;
}
}
cout<<sum;
return 0;
}