public class Main2 {
public static void main(String[] args) {
test01PackWay1();
test01PackWay2();
testCompletePackAnotherWay();
testCompletePackAnotherWay2();
}
public static void test01PackWay1() {
int[] weight = {1, 3, 4};
int[] value = {15, 20 ,30};
int n = weight.length;
int bagSize = 4;
int[][] dp = new int[n][bagSize + 1];
for (int i = weight[0]; i <= bagSize; i++) {
dp[0][i] = value[0];
}
for (int i = 1; i < weight.length; i++) {
for (int j = 1; j <= bagSize; j++) {
if (weight[i] > j){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j-weight[i]] + value[i]);
}
}
}
System.out.println(dp[n-1][bagSize]);
}
public static void test01PackWay2() {
int[] weight = {1, 3, 4};
int[] value = {15, 20 ,30};
int bagSize = 4;
int[] dp = new int[bagSize + 1];
for (int i = weight[0]; i <= bagSize; i++) {
dp[i] = value[0];
}
for (int i = 1; i < weight.length; i++) {
for (int j = bagSize; j >= weight[i]; j--) {
dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
}
}
System.out.println(dp[bagSize]);
}
public static void testCompletePackAnotherWay() {
int[] weight = {1, 3, 4};
int[] value = {15, 20 ,30};
int bagWeight = 4;
int[] dp = new int[bagWeight + 1];
for (int i = weight[0]; i <= bagWeight; i++) {
dp[i] = value[0];
}
for (int i = 1; i < weight.length; i++) {
for (int j = weight[i]; j <= bagWeight; j++) {
dp[j] = Math.max(dp[j], dp[j-weight[i]] + value[i]);
}
}
System.out.println(dp[bagWeight]);
}
public static void testCompletePackAnotherWay2() {
int[] weight = {1, 3, 4};
int[] value = {15, 20 ,30};
int n = weight.length;
int bagSize = 4;
int[][] dp = new int[n][bagSize + 1];
for (int i = weight[0]; i <= bagSize; i++) {
dp[0][i] = value[0];
}
for (int i = 1; i < weight.length; i++) {
for (int j = 1; j <= bagSize; j++) {
if (weight[i] > j){
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-weight[i]] + value[i]);
}
}
}
System.out.println(dp[n-1][bagSize]);
}
}