营养膳食

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

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 struct node
 7 {
 8    int x; //食品脂肪数
 9    int y;//食品类型
10 }a[205];
11 int cmp(node a,node b)
12 {
13    return a.x > b.x;
14 }
15 int main()
16 {
17    freopen("diet.in","r",stdin);
18    freopen("diet.out","w",stdout);
19    int i,m,j = 0,n,k,b[105],t = 0,z = 1;
20    scanf("%d %d %d",&n,&m,&k);
21    for(i = 1;i <= k;i++)
22    {
23       scanf("%d",&b[i]);       //该类型最多吃的数量
24    }
25    for(i = 1;i <= n;i++)
26    {
27       scanf("%d %d",&a[i].x,&a[i].y);
28    }
29    sort(a+1,a+n+1,cmp);
30    while(z <= m)
31    {
32       j = j + 1;
33       if(j > n)
34       {
35           break;
36       }
37       if(b[a[j].y] > 0)
38       {
39           z =  z + 1; //吃的数量
40           t = t + a[j].x;
41           b[a[j].y] = b[a[j].y] - 1;// b[a[j].y]该类型还能吃的数量
42       }
43    }
44    printf("%d",t);
45    return 0;
46 }

***1.把所有的食材脂肪数排序

2.在满足食品总数不超过要求的情况下进行判断

3.在满足吃该类食品不超过要求的情况下吃

4.再把满足要求的食品脂肪数相加。

原文地址:https://www.cnblogs.com/rax-/p/8594089.html