【题目描述】
已知一个载重为M的背包和n(0<n<1000)件物品,第i件物品的重量为 wi,如果将第i件物品全部装入背包,将有收益pi,这里,wi>0,pi>0,0 <=i<n。所谓背包问题是指求一种最佳装载方案,使得收益最大。
【输入】
第一行二个整数,分别表示物品个数n和背包载重M;以下n行每行三个整数,分别输入物品编号i,物品收益pi,物品重量wi。
【输出】
x0,x1,…,xn-1,0 <= xi<=1,0<= i<n,每个xi是第i件物品装入背包中的部分(小数位保留二位)。
【输入样例】
3 20
1 25 18
2 24 15
3 15 10
【输出样例】
0.0 1.00 0.50
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
struct Good{
int id;
double w;
double v;
};
bool cmp(Good a, Good b){
if (a.v/a.w > b.v/b.w) {
return true;
}
return false;
}
bool cmp1(Good a, Good b){
if (a.id <b.id) {
return true;
}
return false;
}
int main()
{
double totalW;
int n,i;
double x[1000];
cin>>n>>totalW;
struct Good goods[n];
for(i=0;i<n;i++){
cin>>goods[i].id>>goods[i].v>>goods[i].w;
x[i]=0;
}
//以物品的价值/重量比值降序排序
sort(goods,goods+n,cmp);
double leftW = totalW;
int totalV = 0;
//遍历排好序的物品数组
for (i=0; i<n; i++) {
if (leftW >= goods[i].w) {
leftW -= goods[i].w;
x[goods[i].id-1]=1; //按照原来的顺序录入
totalV += goods[i].v;
}else {
totalV += leftW/goods[i].w * goods[i].v;
x[goods[i].id-1]=leftW/goods[i].w;
leftW = 0;
break;
}
}
for(i=0;i<n;i++){
printf("%.2lf ",x[i]);
}
return 0;
}