欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

洛谷——部分背包问题【贪心】

程序员文章站 2022-06-08 14:26:05
...

洛谷P2240
洛谷——部分背包问题【贪心】
样例:

输入:
4 50
10 60
20 100
30 120
15 45
输出:
240.00

思路:与动态规划的背包问题不同,此处的金币是可以随意分割的,我们可以运用贪心,优先选取最合适的金币堆。怎么优先选择呢??题中说道:“分割完的金币重量价值比(也就是单位价格)不变”。所以可以优先选择单位价格大的金币堆。
AC代码:

#include<bits/stdc++.h>
using namespace std;
struct Node
{
	int m,v;
}a[105];
bool cmp(const Node &a,const Node &b)
{
	//按单位价格降序排序,交叉相乘避免精度损失
	//a.v/a.m > b.v/b.m  ---->a.v*b.m > b.v*a.m
	return a.v*b.m > b.v*a.m;	
}
int main()
{
	int n,t;
	scanf("%d%d",&n,&t);
	for(int i=0;i<n;i++)
		scanf("%d%d",&a[i].m,&a[i].v);
	sort(a,a+n,cmp);//按单位价格降序排序
	double sum=0;
	for(int i=0;i<n;i++)
	{
		if(t>=a[i].m)//背包能放下整堆金币
		{
			t-=a[i].m;//背包容量减少
			sum+=a[i].v;
		}
		else//不能放下整堆金币
		{
			sum+=1.0*a[i].v/a[i].m*t;//将背包装满
			break;
		}
	}
	printf("%.2f\n",sum);
	return 0;
}
相关标签: 题集