明确选择和状态
初始化,容量为0,物品可供选择为0,总价值为0
选择就是每个珠宝是否选择。
状态就是dp数组,含义是对于dp[i][j] 放第i件物品对于容量j的最大价值为dp[i][j]。
for循环规则,i是 0-m j是 0-n
public class Solution{
int[] vs = {0,2,4,3,7};
int[] ws = {0,2,3,5,5};
Integer[][] results = new Integer[5][11];
@Test
public void testKnapsack3() {
int result = ks3(4,10);
System.out.println(result);
}
private int ks3(int i, int j){
for (int m = 0; m <= i; m++){
results[m][0] = 0;
}
for (int m = 0; m <= j; m++){
results[0][m] = 0;
}
for (int m = 1; m <= i; m++){
for (int n = 1; n <= j; n++){
if (n < ws[m]){
results[m][n] = results[m-1][n];
} else {
if (results[m-1][n] > results[m-1][n-ws[m]] + vs[m]){
results[m][n] = results[m-1][n];
} else {
results[m][n] = results[m-1][n-ws[m]] + vs[m];
}
}
}
}
return results[i][j];
}
}