营养膳食

【题目描述】
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过1 份,鱼类不宜吃超过1 份,蛋类不宜吃超过1 份,蔬
菜类不宜吃超过2 份。阿月想要在营养膳食的情况下吃到更多的脂肪,当然阿月的食量也是有限的。

【输入】
输入第一行包含三个正整数n(n≤200),m(m≤100)和k(k≤100)。表示阿月每顿饭最多可以吃m 份食品,同时有n 种食品供阿月选择,而这n 种食品分为k 类。第二行包含k 个不超过10 的正整数,表示可以吃1 到k 类食品的最大份数。接下来n 行每行包括2 个正整数,分别表示该食品的脂肪指数ai 和所属的类别bi,其中ai≤100,bi≤k。

【输出】
输出一个数字即阿月可以吃到的最大脂肪指数和。

【样例输入】
6 6 3
3 3 2
15 1
15 2
10 2
15 2
10 2
5 3

【样例输出】
60

当初我第一次看到这道题的时候,以为是一个分组背包。然后我去洛谷搜了一下,看到的是普及+,顿时整个人就不好了,然后就花了整整半分钟思考了一下,发现就是一个贪心。

贪心取价值最大的,直到取到 m 份或是所有给的都去完了。

 1 #include<cstdio>
 2 #include<iostream>
 3 #include<cmath>
 4 #include<algorithm>
 5 #include<cstring>
 6 using namespace std;
 7 
 8 #define rep(i ,a, n) for(int i = a; i <= n; ++i)
 9 #define per(i, n, a) for(int i = n; i >= a; --i)
10 typedef long long ll;
11 const int maxn = 1e3 + 5;
12 
13 struct Node
14 {
15     int fat, num;
16     bool operator < (const Node& other)const
17     {
18         return fat > other.fat;
19     }
20 }a[maxn];
21 int n, m, k, maxnum[maxn];
22 int ans = 0, tot = 0;
23 
24 int main()
25 {
26     freopen("diet.in", "r", stdin);
27     freopen("diet.out", "w", stdout);
28     scanf("%d%d%d", &n, &m, &k);
29     rep(i, 1, k) scanf("%d", &maxnum[i]);
30     rep(i, 1, n) scanf("%d%d", &a[i].fat, &a[i].num);
31     sort(a + 1, a + n + 1);
32     rep(i, 1, n)
33     {
34         if(tot >= m) break;
35         if(maxnum[a[i].num] > 0) {maxnum[a[i].num]--; tot++; ans += a[i].fat;}
36     }
37     printf("%d
", ans);
38 }
原文地址:https://www.cnblogs.com/mrclr/p/8584146.html