纯动态规划:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int N=scan.nextInt();//不超过500
int M=scan.nextInt();//不超过100000
int [][] dp = new int[N+1][M+1];
int [] need = new int[N+1];//need[i]不超过200000
int [] value = new int[N+1];//value[i]不超过1000
for(int i=1;i<=N;i++) {
need[i] = scan.nextInt();
value[i] = scan.nextInt();
}
scan.close();
for(int i=0;i<=N;i++) {
dp[i][0]=0;
}
for(int j=1;j<=M;j++) {
dp[0][j]=0;
}
for(int i=1;i<=N;i++) {
for(int j=1;j<=M;j++) {
if(j<need[i]) {
dp[i][j] = dp[i-1][j];
}
else {
if(dp[i-1][j]<dp[i-1][j-need[i]]+value[i]) {
dp[i][j] = dp[i-1][j-need[i]]+value[i];
}
else {
dp[i][j] = dp[i-1][j];
}
}
}
}
System.out.println(dp[N][M]);
}
}
空间优化,但不可回溯:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
int N=scan.nextInt();//不超过500
int M=scan.nextInt();//不超过100000
int [] dp1 = new int[M+1];
int [] need = new int[N+1];//need[i]不超过200000
int [] value = new int[N+1];//value[i]不超过1000
for(int i=1;i<=N;i++) {
need[i] = scan.nextInt();
value[i] = scan.nextInt();
}
scan.close();
for(int j=1;j<=M;j++) {
dp1[j]=0;
}
for(int i=1;i<=N;i++) {
for(int j=M;j>need[i];j--) {
if(dp1[j]<dp1[j-need[i]]+value[i]) {
dp1[j] = dp1[j-need[i]]+value[i];
}
}
}
System.out.println(dp1[M]);
}
}