首页 新闻 会员 周边 捐助

问题(特别重要)

0
悬赏园豆:20 [已解决问题] 解决于 2023-07-12 11:15

题目描述
营养膳食/foods
题目描述
Mr.L 正在完成自己的增肥计划。为了增肥,Mr.L 希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。

Mr.L 通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过
1
1 份,鱼类不宜吃超过
1
1 份,蛋类不宜吃超过
1
1 份,蔬菜类不宜吃超过
2
2 份。

Mr.L 想要在营养膳食的情况下吃到更多的脂肪,当然 Mr.L 的食量也是有限的。

输入格式
第一行包含三个正整数

,

n,m 和

k。表示 Mr.L 每顿饭最多可以吃

m 份食品,同时有

n 种食品供 Mr.L 选择,而这

n 种食品分为

k 类。

第二行包含

k 个不超过
10
10 的正整数,表示可以吃
1
1 到

k 类食品的最大份数。

接下来

n 行每行包括
2
2 个正整数,分别表示该食品的脂肪指数


a
i

和所属的类别


b
i

输出格式
包括一个数字即 Mr.L 可以吃到的最大脂肪指数和。

深秋晨风的主页 深秋晨风 | 初学一级 | 园豆:51
提问于:2023-07-11 19:42
< >
分享
最佳答案
0

可以使用动态规划的方法来计算 Mr.L 可以吃到的最大脂肪指数和。

首先,我们可以定义一个二维数组 dp,其中 dp[i][j] 表示在前 i 种食品中选择不超过 j 份的情况下,可以获得的最大脂肪指数和。

然后,我们可以使用以下递推关系来计算 dp 数组的值:

dp[i][j] = max(dp[i-1][j], dp[i-1][j-k] + fat[i])

其中,fat[i] 表示第 i 种食品的脂肪指数,k 表示第 i 种食品的份数。

最后,我们可以遍历 dp 数组的最后一行,找到最大的脂肪指数和即可。

下面是一个示例代码,实现了上述算法:

using System;

class Program
{
    static void Main(string[] args)
    {
        string[] input = Console.ReadLine().Split();
        int n = int.Parse(input[0]);
        int m = int.Parse(input[1]);
        int k = int.Parse(input[2]);

        int[] maxCounts = Array.ConvertAll(Console.ReadLine().Split(), int.Parse);

        int[,] foods = new int[n, 2];
        for (int i = 0; i < n; i++)
        {
            string[] food = Console.ReadLine().Split();
            foods[i, 0] = int.Parse(food[0]);
            foods[i, 1] = int.Parse(food[1]);
        }

        int[,] dp = new int[n + 1, m + 1];
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                int maxFat = 0;
                for (int k = 0; k <= Math.Min(maxCounts[foods[i - 1, 1] - 1], j); k++)
                {
                    maxFat = Math.Max(maxFat, dp[i - 1, j - k] + k * foods[i - 1, 0]);
                }
                dp[i, j] = maxFat;
            }
        }

        Console.WriteLine(dp[n, m]);
    }
}
收获园豆:20
lanedm | 老鸟四级 |园豆:2396 | 2023-07-12 09:34
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册