题意:
有n个物品,每个物品的重量为weight[i],每个物品的价值为value[i]。现在有一个背包,它所能容纳的重量为total,问:当你面对这么多有价值的物品时,你的背包所能带走的最大价值是多少?(注意和0/1背包问题的区别,在背包问题中,可以选择将某种物品的一部分装入背包中,但不可以重复装入)
分析:
选择单位重量价值最大的物品
#include
#include
#include
using namespace std;
const int maxn=30;
int n,C;
double x[maxn]; //储存某一物品装入的比例(全部还是部分)
struct node
{
double x,y;
}data[maxn]; //x代表物品的重量,y代表物品的价值
int cmp(struct node a,struct node b)
{
return (a.y/a.x)>(b.y/b.x);
}
int maxval()
{
x[maxn]={0};
int i;
double maxvalue=0;
for(i=0;data[i].x<=C;i++)
{
x[i]=1; //物品i全部装入
maxvalue+=data[i].y;
C=C-data[i].x;
}
x[i]=C/data[i].x; //物品i装入部分
maxvalue+=x[i]*data[i].y;
return maxvalue;
}
int main()
{
while(cin>>n>>C)
{
for(int i=0;i
>data[i].x; //物品的重量
for(int i=0;i
>data[i].y; // 物品的价值 sort(data,data+n,cmp); //按物品单位重量的价值从大到小排序 cout<
<