采仙草  OpenJ_Bailian - 2726  JAVA 动态规划 01背包

92 篇文章 0 订阅
75 篇文章 0 订阅

D - 采仙草

 OpenJ_Bailian - 2726 

Adrian想挖一些仙草。仙人告诉他,前方有一块草场可以采集仙草,这些仙草的价值和采集所用时间会有不同。Adrian不想浪费这次挖仙草的机会,当然希望能挖到仙草的总价值最大,请你帮Adrian计算一下在一定的时间T内能挖到的仙草价值总和最大值。

Input

输入第一行有两个整数T和N由一个空格分隔,其中T表示总共用以采药的时间,N表示草场共有N棵仙草。接下来有N行,每行是两个整数t和v由一个空格分隔,表示各棵仙草采集所需要的时间和仙草的价值

  • 1≤T≤1000
  • 1≤N≤10
  • 1≤t,v≤100

Output

输出只有一行,一个整数,表示在时间T内Adrian可以采到仙草的最大总价值。

Sample Input

输入样例

70 3
71 100
69 1
1 2

输出样例

3

经典的背包问题,01背包。

其实就算不会DP,也应该会DFS能过一部分数据的。

这个题贪心是不能的,注意和其他背包问题区分,因为最后可能存在剩余的空间,不存在小数的问题。

import java.util.Scanner;
 
public class Main{
	public static void main(String args[]){
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		int n = sc.nextInt();
		int w[] = new int[n+1];
		int v[] = new int[n+1];
		int dp[] = new int[T+1];
		for (int i = 1; i <= n; i++) {
			w[i] = sc.nextInt();
			v[i] = sc.nextInt();
		}
		dp[0] = 0;
		for (int i = 1; i <= n; i++) {
			for (int j = T; j >= w[i]; j--) {//w[i]以后的j对答案没有贡献 
				dp[j] = Math.max(dp[j], dp[j-w[i]]+v[i]);
			}
		}
		System.out.println(dp[T]);
	}	
}	

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值