1.普通背包(物品可以拆零)
按权重排序
描述
有N瓶快乐水,第i个物品的快乐度为J_i,重量为F_i,
现在你有一个可以装重为M的杯子 ,问你最多可以获得多少快乐?
输入
第一行包含两个非负整数 M 和 N 。
接下来的 N 行,每行相应包含了两个正整数J_i 和F_i。
保证所有数据都为不超过1000的正整数。
输出
打印一个实数,精确到小数点后 3 位数,表示能够获得最大的快乐
样例
输入:
5 3
7 2
4 3
5 2
输出:
13.333
#include<iostream>
#include<math.h>
#include<cstring>
#include<algorithm>
using namespace std;
const int Max=10000;
struct bei{
double val;
double weigh;
double pingjun;
};
bool cmp(bei o,bei p){
return o.pingjun>p.pingjun;
}
int n;
int m;
int main() {
scanf("%d",&m);
scanf("%d",&n);
bei wuping[n];
double res=0;
for(int i=0;i<n;i++){
scanf("%lf",&wuping[i].val);
scanf("%lf",&wuping[i].weigh);
wuping[i].pingjun=wuping[i].val/wuping[i].weigh;
}
sort(wuping,wuping+n,cmp);
int i=0;
for(;m>wuping[i].weigh;i++){
res+=wuping[i].val;
m-=wuping[i].weigh;
}
res+=(m*wuping[i].pingjun);
printf("%.3f",res);
}