背包问题是指在一个有限的背包中,放置若干个物品,使得它们的总价值最大。它是一种动态规划算法,通过填表的方式来解决问题。
下面是背包问题的Java实现:
public class Knapsack {
public static int knapsack(int[] w, int[] v, int W) {
int n = w.length;
int[][] dp = new int[n + 1][W + 1];
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= W; j++) {
if (w[i - 1] <= j) {
dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - w[i - 1]] + v[i - 1]);
} else {
dp[i][j] = dp[i - 1][j];
}
}
}
return dp[n][W];
}
}
代码分析:
- 首先定义一个二维数组dp,其中dp[i][j]表示前i个物品放入容量为j的背包中所获得的最大价值。
- 初始化dp[0][j]和dp[i][0]为0,表示不放物品或背包容量为0时,最大价值为0。
- 对于第i个物品,有两种选择:
- 不放入背包中,此时价值为dp[i – 1][j]。
- 放入背包中,此时价值为dp[i – 1][j – w[i – 1]] + v[i – 1],其中w[i – 1]和v[i – 1]分别表示第i个物品的重量和价值。