题目描述
XP每天都会思考一个问题,今天午餐去哪里吃?这是一个很重要的问题,这会影响到他下午的体力值。他的午餐预算是M元,现在有N种菜品,每一种菜品的价格和能够提供的体力值已知(每种菜品只能选择一次),请问如何选择菜品能够让XP下午的体力值最大呢?
输入
第一行:M元和菜品数量N。
接下来N行,每一行两个整数,分别表示每一种菜品的价格(vi)和能够获得的体力值(wi)。
(0<N<=20,0<=M<=1000)(0<=vi<=50,0<=wi<=100)
输出
最大体力值。
样例输入
10 5
1 5
2 4
3 3
4 2
5 1
样例输出
14
代码实现
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
while(sc.hasNext()) {
int M = sc.nextInt();
int N = sc.nextInt();
//菜品价格
int v[] = new int[N];
//获取的体力值
int w[] = new int[N];
for(int i=0;i<N;i++) {
v[i] = sc.nextInt();
w[i] = sc.nextInt();
}
int m[][] = new int[N][M+1];
int jMax = Math.min(v[N-1]-1,M);
for(int j=0;j<=jMax;j++)
m[N-1][j] = 0;
for(int j=v[N-1];j<=M;j++)
m[N-1][j] = w[N-1];
for(int i=N-2;i>=0;i--) {
int jMax1 = Math.min(v[i]-1, M);
for(int j=0;j<=jMax1;j++)
m[i][j] = m[i+1][j];
for(int j=v[i];j<=M;j++)
m[i][j] = Math.max(m[i+1][j], m[i+1][j-v[i]]+w[i]);
}
System.out.println(m[0][M]);
}
sc.close();
}
}