P2095 【营养膳食】
这道题是用贪心的思路的,因为每份食物的重量都是1,所以不存在动归的问题。
那要怎么贪呢,就是先吃脂肪最多的那份食物
下面上代码
#include <bits/stdc++.h> using namespace std; int n, m, k; int eatub[105];//eat upper bound 第i种食物最多能吃的数量 struct food_type { int fat;//脂肪 int type;//所属的种类 } food[205]; bool judge(food_type &a, food_type &b) { return a.fat > b.fat;//按脂肪降序排列 } int main() { //读入 int n, m, k; int ans = 0; cin >> n >> m >> k; for (int i = 0; i < k; ++i) cin >> eatub[i]; for (int i = 0; i < n; ++i) cin >> food[i].fat >> food[i].type; //贪心的思路,先吃脂肪多的 //排序 sort(food, food + n, judge); //贪心 for (int i = 0; i < n; ++i) {//最好情况就是把所有食物吃光 if (m > 0 && eatub[food[i].type - 1] > 0) {//如果还没饱并且这种食物还能吃 //把它吃掉 eatub[food[i].type - 1]--; m--; ans += food[i].fat; } } cout << ans; return 0; }