题目描述
Description
有一个背包,背包容量是M(0<M≤200),有N(1<N≤1000)个物品,物品可以分割成任意大小。要求尽可能让装入背中
的物品总价值最大,但不能超过总容量。
输入输出格式
输入格式:
Input
第1行有两个数,M和N;
第2行到N+1行:第i行为第i-1个物品的价值和质量(均为小于100的正整数),中间用空格隔开。
输出格式:
Output
只有一个数为最大总价值(保留一位小数)。
输入输出样例
输入样例#1:
150 7
10 35
40 30
30 60
50 50
35 40
40 10
30 25
输出样例#1:
190.6
分析
这是一道背包与贪心结合的题目,非常简单🙂
因为要价值尽量大,所以
算法
先求出所有物品的单价,然后从大到小排序,从大的开始拿,最后容量不够的时候取一部分并退出循环
接下来贴一下我的代码
CODE
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<iomanip>
using namespace std;
int m,n,i;
double ans=0;
struct node
{
int v,w;
double s;
}a[1100];
bool cmp(node x,node y)
{
return x.s>y.s;
}
int main()
{
cin>>m>>n;
for(i=1;i<=n;i++)
{
cin>>a[i].v>>a[i].w;
a[i].s=double(a[i].v)/a[i].w;
}
sort(a+1,a+1+n,cmp);
for(i=1;i<=n;i++)
{
if(m>a[i].w)
{
m-=a[i].w;
ans+=a[i].v;
}
else
{
ans+=m*a[i].s;
break;
}
}
cout<<fixed<<setprecision(1)<<ans;
return 0;
}
记得点赞哦