(Java实现)洛谷 P2095 营养膳食

题目描述
Mr.L正在完成自己的增肥计划。

为了增肥,Mr.L希望吃到更多的脂肪。然而也不能只吃高脂肪食品,那样的话就会导致缺少其他营养。Mr.L通过研究发现:真正的营养膳食规定某类食品不宜一次性吃超过若干份。比如就一顿饭来说,肉类不宜吃超过1份,鱼类不宜吃超过1份,蛋类不宜吃超过1份,蔬菜类不宜吃超过2份。Mr.L想要在营养膳食的情况下吃到更多的脂肪,当然Mr.L的食量也是有限的。

输入输出格式
输入格式:

第一行包含三个正整数n(n≤200),m(m≤100)和k(k≤100)。表示Mr.L每顿饭最多可以吃m份食品,同时有n种食品供Mr.L选择,而这n种食品分为k类。第二行包含k个不超过10的正整数,表示可以吃1到k类食品的最大份数。接下来n行每行包括2个正整数,分别表示该食品的脂肪指数ai和所属的类别bi,其中ai≤100,bi≤k。

输出格式:

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

输入输出样例
输入样例#1

6 6 3
3 3 2
15 1
15 2
10 2
15 2
10 2
5 3
输出样例#

60
思路
Mr.L能吃的食物总数是有限的,每一类别的食物还分别有限。他希望在这些限制条件下吃到尽可能多的脂肪。

这不就是需要我们贪心选择一个策略嘛。

如果他优先选择剩下食物中脂肪最多的,而如果该类别的食物已经吃得超过上限,就丢掉,去吃下一个,不就行了?

所以需要无脑排序。

No picture you say a jb.

在这里插入图片描述

由图可知,选择剩下食物中可选的(即还没超出限制)、脂肪最多的总是最优的。也许后面的也不错,但是因为不是最好的才丢掉。

import java.util.Arrays;
import java.util.Scanner;


public class yingyangshanshi {
	public static void main(String[] args) {
		Scanner sc =new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int k = sc.nextInt();
		int [] count = new int [k+1];
		for (int i = 1; i < count.length; i++) {
			count[i]=sc.nextInt();
		}
		int [] zhi = new int [n];
		int [] lei = new int [n];
		int [] leibie = new int [n];
		int [] zhifang = new int [n];
		int sum = 0;
		int shu = m;
		boolean [] yong = new boolean [n];
		for (int i = 0; i < n; i++) {
			zhi[i]=sc.nextInt();
			zhifang[i]=zhi[i];
			lei[i]=sc.nextInt();
		}
		Arrays.sort(zhifang);
		for (int i = 0; i < yong.length; i++) {
			for (int j = 0; j < yong.length; j++) {
				if(zhifang[i]==zhi[j] && !yong[j]){
					leibie[i]=lei[j];
					yong[j]=true;
					break;
				}
			}
		}
		for (int i = yong.length-1; i >=0; i--) {
			if(count[leibie[i]]==0){
				continue;
			}
			sum+=zhifang[i];
			count[leibie[i]]--;
			shu--;
			if(shu==0){
				break;
			}
		}
		System.out.println(sum);
	}

}

原文地址:https://www.cnblogs.com/a1439775520/p/13079435.html