7-25 部分背包 (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
作者
严华云
单位
湖州师范学院
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
#include<iostream>
#include<stdio.h>
using namespace std;
int main(){
int v,n;
double maxx=0.0;
cin>>v>>n;
double shangpin[n][3];
for(int i=0;i<n;i++){
cin>>shangpin[i][0]>>shangpin[i][1];
shangpin[i][2]=shangpin[i][1]/shangpin[i][0];
//cout<<shangpin[i][2];
}
for(int i=0;i<n;i++){
int max=i;
for(int j=i+1;j<n;j++){
if(shangpin[j][2]>shangpin[max][2]){
max=j;
}
}
double temp0,temp1,temp2;
temp0=shangpin[i][0];
temp1=shangpin[i][1];
temp2=shangpin[i][2];
shangpin[i][0]=shangpin[max][0];
shangpin[i][1]=shangpin[max][1];
shangpin[i][2]=shangpin[max][2];
shangpin[max][0]=temp0;
shangpin[max][1]=temp1;
shangpin[max][2]=temp2;
// cout<<shangpin[i][0]<<" "<<shangpin[i][1]<<" "<<shangpin[i][2]<<endl;
}
for(int i=0;i<n;i++){
if(shangpin[i][0]<v){
maxx+=shangpin[i][1];
v-=shangpin[i][0];
}
else{
maxx+=shangpin[i][2]*v;
}
}
printf("%.2lf",maxx);
}