背包问题


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);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值