题目描述
有一个背包,背包容量是m。有n个物品,每个物品都有自己的重量wi和价值vi,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
输入
第一行输入两个正整数 m 和 n (1≤ m, n ≤ 10000) 分别代表背包容量和物品的个数
第二行输入 n 个正整数 表示每个物品的重量 wi (1 ≤ wi ≤ 10000)
第三行输入 n 个正整数 表示每个物品的价值 vi (1 ≤ vi ≤ 10000)
输出
输出一个数,表示可装入背包的最大容量时的价值(结果保留两位小数)
样例输入
150 7 35 30 60 50 40 10 25 10 40 30 50 35 40 30
样例输出
190.62
代码的高光时刻来了!(其实就是代码)
贪心100分
#include<bits/stdc++.h>
using namespace std;
struct node{
double w,v,s;
}p[10005];
bool cmp(node a,node b){
return a.s>b.s;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)cin>>p[i].w;
for(int i=0;i<m;i++){
cin>>p[i].v;
p[i].s=p[i].v/p[i].w;
}sort(p,p+m,cmp);
double sum=0.0;
for(int i=0;i<m;i++){
if(n>=p[i].w){
sum+=p[i].v;
n-=p[i].w;
}else{
sum+=p[i].s*n;
break;
}
}cout<<fixed<<setprecision(2)<<sum<<endl;
return 0;
}
背包100分(就是贪心)
#include<bits/stdc++.h>
using namespace std;
struct node{
double w,v,s;
}p[10005];
bool cmp(node a,node b){
return a.s>b.s;
}
int main(){
int n,m;
cin>>n>>m;
for(int i=0;i<m;i++)cin>>p[i].w;
for(int i=0;i<m;i++){
cin>>p[i].v;
p[i].s=p[i].v/p[i].w;
}sort(p,p+m,cmp);
double sum=0.0;
for(int i=0;i<m;i++){
if(n>=p[i].w){
sum+=p[i].v;
n-=p[i].w;
}else{
sum+=p[i].s*n;
break;
}
}cout<<fixed<<setprecision(2)<<sum<<endl;
return 0;
}