简单贪心总结

来源:互联网 发布:java读取中文乱码 编辑:程序博客网 时间:2024/05/29 15:11
题目描述
大家千万别让波波蒙人的外表给骗了,其实他就是偷吃界所向披靡的大胃王……
从前,有一天,实验室买了一批新零食,而又刚好大家出去吃饭了,月黑风高,波波出动了……
假设他有一个容量为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;}


0 0
原创粉丝点击