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.再把满足要求的食品脂肪数相加。