题目描述
大家千万别让波波蒙人的外表给骗了,其实他就是偷吃界所向披靡的大胃王……
从前,有一天,实验室买了一批新零食,而又刚好大家出去吃饭了,月黑风高,波波出动了……
假设他有一个容量为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
大家千万别让波波蒙人的外表给骗了,其实他就是偷吃界所向披靡的大胃王……
从前,有一天,实验室买了一批新零食,而又刚好大家出去吃饭了,月黑风高,波波出动了……
假设他有一个容量为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;
}