题目描述
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;
}
记得点赞哦

该文章介绍了一种结合背包问题和贪心算法的解决方案。给定一个背包容量和多个可分割物品,目标是最大化物品的总价值而不超过背包容量。文章通过计算每个物品的单价,对物品进行排序,然后从单价最高的物品开始选取,以达到最大价值。代码示例展示了如何实现这一策略。
1764

被折叠的 条评论
为什么被折叠?



