动态规划。
- 最大价值,需要考虑在N容量的背包放入哪几个物品。即状态为容量和物品
- 在容量和物品的状态中,每次有两种状态装进背包和未装进背包
- 综上:
- 定义DP数组dp[i][j]表示前i个物品装进容量为j的背包的最大价值
- dp[i][j]=max[dp[i−1][j],dp[i−1][j−weight[i]]+value[i]]
- coding
int knapsack(int W, int N, int[] wt, int[] val) {
int N == wt.length;
int[][] dp = new int[N][W];
for (int i = 0; i < N; i++) {
for (int w = 0; w < W; w++) {
if (w - wt[i - 1] < 0) {
dp[i][w] = dp[i - 1][w];
} else {
dp[i][w] = Math.max(
dp[i - 1][w - wt[i-1]] + val[i-1],
dp[i - 1][w]);
}
}
}
return dp[N][W];
}