7-13 部分背包 (10 分)

7-13 部分背包 (10 分)
给定 N 种物品和一个背包。物品 i 的重量是 W i ,价值为 V i ;背包的容量为 V。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大?在选择装入背包的物品,对每种物品可以选择:全部装入或装入部分,且不能重复装入。输入数据的第一行分别为:背包的容量 V,物品的个数 N。接下来的 N 行表示 N 个物品的重量和价值。输出为最大的总价值。

输入格式:
第一行连个整数,分别是V和N(<=1000) 接下来N行,每行分别为 W i 和 V i

输出格式:
输出为最大的总价值(保留两位小数)

输入样例:
15 4
3 5
4 6
5 7
7 12

输出样例:
24.40

思路:因为要尽可能的装进更值钱的物品 然后因为该题目的物品是可以分块的 所以我们可以计算每个物品每个单位空间的价格 按照价格去进行降序 然后选物品就行了
下面两个代码块的主要区别在于计算单位空间的价值的代码
第一个代码我考虑到最恶心的情况就是物品weight为0 那么他单位空间的价格就要直接那它本身来记录了 第二个代码是直接用价格/质量 他的测试点好像没有考虑这个恶心的点所以两个代码块都能AC
因为写的很草率 最后判断的点没考虑的很清楚 主要是图AC 能AC就行了 见谅

#include <bits/stdc++.h>
using namespace std;
struct wupin{
	double weight;
	double jiage;
	double pingjun;
};
int main()
{
	wupin a[1001],temp;
	int w,n;
	cin>>w>>n;
	int i,j;
	for (i=1;i<=n;i++){
		cin>>a[i].weight >>a[i].jiage ;
		if(a[i].weight ==0){
			a[i].pingjun =a[i].jiage ;
		}
		else{
			a[i].pingjun =a[i].jiage /a[i].weight ;
		}
	}
	for (i=1;i<=n;i++){
		for (j=i+1;j<=n;j++){
			if(a[i].pingjun <a[j].pingjun ){
				temp=a[i];a[i]=a[j];a[j]=temp;
			}
		}
	}
	double count=0;
	for (i=1;i<=n;i++){
		if(a[i].weight <=w&&w>0){
			count+=a[i].jiage ;
		}
		else if(a[i].weight >w&&w>0){ 
			count+=a[i].pingjun *w;
		}
		else if(w<=0){
			break;
		}
		w-=a[i].weight ;
	}
	printf("%.2f",count);
	return 0;
}
#include <bits/stdc++.h>
using namespace std;
struct wupin{
	double weight;
	double jiage;
	double pingjun;
};
int main()
{
	wupin a[1001],temp;
	int w,n;
	cin>>w>>n;
	int i,j;
	for (i=1;i<=n;i++){
		cin>>a[i].weight >>a[i].jiage ;
		a[i].pingjun =a[i].jiage /a[i].weight ;
	}
	for (i=1;i<=n;i++){
		for (j=i+1;j<=n;j++){
			if(a[i].pingjun <a[j].pingjun ){
				temp=a[i];a[i]=a[j];a[j]=temp;
			}
		}
	}
	double count=0;
	for (i=1;i<=n;i++){
		if(a[i].weight <=w&&w>0){
			count+=a[i].jiage ;
		}
		else if(a[i].weight >w&&w>0){ 
			count+=a[i].pingjun *w;
		}
		else if(w<=0){
			break;
		}
		w-=a[i].weight ;
	}
	printf("%.2f",count);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

关迪迪屁事.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值