D - 采仙草
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]);
}
}