题目描述
营养膳食/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 可以吃到的最大脂肪指数和。
可以使用动态规划的方法来计算 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]);
}
}