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;
}