思路: 首先,我们需要将食物按照类别进行分类,并将每个类别的食物按照蛋白质含量从大到小进行排序。

然后,我们需要建立一个二维数组dp,其中dp[i][j]表示在前i种类别的食物中,选择不超过j份食物所能获得的最大蛋白质含量总和。

对于dp[i][j],可以有两种选择:

  1. 不选择第i种类别的食物,那么dp[i][j] = dp[i-1][j];
  2. 选择第i种类别的食物,那么dp[i][j] = dp[i-1][j-k] + k * 蛋白质含量,其中k为不超过j份的第i种类别食物的份数。

最后,我们需要找到dp[n][m]的最大值,即可得到可以吃到的最大蛋白质含量总和。

具体实现如下:

#include #include #include using namespace std;

struct Food { int protein; int category; };

bool cmp(Food a, Food b) { return a.protein > b.protein; }

int main() { int n, m, k; cin >> n >> m >> k;

vector<int> maxNum(k);
for (int i = 0; i < k; i++) {
    cin >> maxNum[i];
}

vector<Food> foods(n);
for (int i = 0; i < n; i++) {
    cin >> foods[i].protein >> foods[i].category;
}

sort(foods.begin(), foods.end(), cmp);

vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0));

for (int i = 1; i <= n; i++) {
    int curCategory = foods[i - 1].category;
    int curProtein = foods[i - 1].protein;
    int maxCurNum = min(maxNum[curCategory - 1], m);
    for (int j = 1; j <= m; j++) {
        dp[i][j] = dp[i - 1][j];
        for (int k = 1; k <= maxCurNum; k++) {
            if (j - k >= 0) {
                dp[i][j] = max(dp[i][j], dp[i - 1][j - k] + k * curProtein);
            }
        }
    }
}

cout << dp[n][m] << endl;

return 0;
C++题目描述寒假到了为了能够更加健康地迎接新年的到来王老师决定开始健康饮食努力健身。 为了增肌他希望吃到更多的蛋白质。然而也不能只吃高蛋白食品那样的话就会导致缺少其他营养。他通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说肉类不宜吃超过1份鱼类不宜吃超过1份蛋类不宜吃超过1份蔬菜类不宜吃超过2份。王老师想要在营养膳食的情况下吃到更多的蛋白质当然他的食量也是有限的。

原文地址: http://www.cveoy.top/t/topic/ib3R 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录