【题目描述】
阿月正在女朋友宁宁的监督下完成自己的增肥计划。
为了增肥,阿月希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。阿月通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过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\n", ans); 38 }