KY66 点菜问题(用Java实现)

描述

    北大网络实验室经常有活动需要叫外卖,但是每次叫外卖的报销经费的总额最大为C元,有N种菜可以点,经过长时间的点菜,网络实验室对于每种菜i都有一个量化的评价分数(表示这个菜可口程度),为Vi,每种菜的价格为Pi, 问如何选择各种菜,使得在报销额度范围内能使点到的菜的总评价分数最大。     注意:由于需要营养多样化,每种菜只能点一次。

输入描述:

    输入的第一行有两个整数C(1 <= C <= 1000)和N(1 <= N <= 100),C代表总共能够报销的额度,N>代表能点菜的数目。接下来的N行每行包括两个在1到100之间(包括1和100)的的整数,分别表示菜的>价格和菜的评价分数。

输出描述:

    输出只包括一行,这一行只包含一个整数,表示在报销额度范围内,所点的菜得到的最大评价分数。

示例1

输入:

90 4
20 25
30 20
40 50
10 18
40 2
25 30
10 8

输出:

95
38

代码如下:


import java.util.Scanner;

/*
 * 点菜问题(动态规划)
 * 
 */
public class OrderFood {

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		while (scanner.hasNext()) {
			int c = scanner.nextInt();	//总共能报销的额度
			int n = scanner.nextInt();	//代表能点菜数目
			
			int[] price = new int[n];	//菜的价格 
			int[] value = new int[n];	//评价分数
			
			for (int i = 0; i < n; i++) {
				
				price[i] = scanner.nextInt();
				value[i] = scanner.nextInt();
			}
			
			int[] dp = new int[c + 1];	//表示报销额度为n时,所点的菜的最大评分分数
			
			for (int i = 0; i < n; i++) {
				
				for (int j = c; j >= price[i]; j--) {
					dp[j] = Math.max(dp[j], dp[j-price[i]]+value[i]);
				}
			}
			
			System.out.println(dp[c]);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laz124519

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值