实现
import java.util.Scanner;
/**
* Created by Kong on 2021/1/6.
*/
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int[] Value = new int[N+1];
int[] Weight = new int[N+1];
for(int i = 1; i <= N; i++){
Weight[i] = sc.nextInt();
Value[i] = sc.nextInt();
}
System.out.println(packageQuestion1(N,M,Weight,Value));
System.out.println(packageQuestion2(N,M,Weight,Value));
System.out.println(packageQuestion3(N,M,Weight,Value));
System.out.println(packageQuestion4(N,M,Weight,Value));
System.out.println(packageQuestion5(N,M,Weight,Value));
}
//0-1背包,未优化
public static int packageQuestion1(int N, int M, int[] Weight, int[] Value){
int[][] dp = new int[N+1][M+1];
for(int i = 1; i <= N; i++){
for(int j = 1; j <= M; j++){
if(j >= Weight[i]){
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-Weight[i]]+Value[i]);
}else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[N][M];
}
//0-1背包,优化
public static int packageQuestion2(int N, int M, int[] Weight, int[] Value){
int[] dp = new int[M+1];
for(int i = 1; i <= N; i++){
for(int j = M; j >= Weight[i]; j--){
dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
}
}
return dp[M];
}
//0-1背包,装满
public static int packageQuestion3(int N, int M, int[] Weight, int[] Value){
int[] dp = new int[M+1];
for(int i = 1; i <= M; i++){
dp[i] = Integer.MIN_VALUE;//(求最大值填入最小值,求最小值填入最大值)
}
for(int i = 1; i <= N; i++){
for(int j = M; j >= Weight[i]; j--){
dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
}
}
return dp[M];
}
//完全背包,未优化
public static int packageQuestion4(int N, int M, int[] Weight, int[] Value){
int[][] dp = new int[N+1][M+1];
for(int i = 1; i <= N; i++){
for(int j = 1; j <= M; j++){
if(j >= Weight[i]){
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-Weight[i]]+Value[i]);
}else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[N][M];
}
//完全背包,优化
public static int packageQuestion5(int N, int M, int[] Weight, int[] Value){
int[] dp = new int[M+1];
for(int i = 1; i <= N; i++){
for(int j = Weight[i]; j <= M; j++){
dp[j] = Math.max(dp[j], dp[j-Weight[i]]+Value[i]);
}
}
return dp[M];
}
}
参考