简单贪心总结

题目描述
大家千万别让波波蒙人的外表给骗了,其实他就是偷吃界所向披靡的大胃王……
从前,有一天,实验室买了一批新零食,而又刚好大家出去吃饭了,月黑风高,波波出动了……
假设他有一个容量为m的胃,实验室的n件食物每件都有体积Vi,有每一单位体积的美味值Di,他想要能偷吃到食物的美味值相加和最大,假设他可以每件食物都偷吃一点,当然也可以吃完。
常言道,征服一个男人就征服他的胃,各位新acmer们,征服波波吧。


输入
输入数据有T(T<10)组,每一组第一行是n与m,接着n行的Vi、Di,保证m<=500,n<=100,Vi<=100,Di<=2^16 .


输出
输出波波能偷吃到的最大美味值和。


样例输入
1
4 15
5 10
5 9
5 8
5 7
样例输出
135

提示


这是一道简单的贪心题,刚看到以为是0-1背包的升级。
思路:定义一个sum = 0, area = 0。先按每一体积Di按从大到小进行排序,然后将排好的美味值进行Di*Vi与sum相加,area与Vi相加,然后比较area和m哪个大,
如果area比较大,那么算出刚好塞进m的那个体积,这个体积和对应的美味值相乘,再与sum相加,即为答案。
如果area与m刚好相等,那么就刚好了


#include<iostream>
using namespace std;
struct MyStruct
{
	int V;
	long D;
};
int main()
{
	MyStruct eat[102];
	int T;
	cin >> T;
	while (T--)
	{
		long value = 0;
		int n, m;
		cin >> n >> m;
		for (int i = 1; i <= n; i++)
		{
			int v;
			long d;
			cin >> v >> d;
			eat[i].V = v;
			eat[i].D = d;
		}
		for (int i = 1; i <= n; i++)
		{
			for (int j = i + 1; j <= n; j++)
			{
				int v1;
				long d1;
				if (eat[i].D < eat[j].D)
				{
					v1 = eat[i].V;
					d1 = eat[i].D;

					eat[i].V = eat[j].V;
					eat[i].D = eat[j].D;

					eat[j].V = v1;
					eat[j].D = d1;
				}
			}
		}
		int sum = 0;
		
		for (int k = 1; k <= n; k++)
		{
			sum += eat[k].V;
			if (m >= sum)
			{
				value += eat[k].D * eat[k].V;
			}
			else
			{
				int v2 = eat[k].V - (sum - m);
				value += v2 * eat[k].D;
				break;
			}
		}
		cout << value << endl;
	}
	getchar();
	getchar();
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值