背包问题堪称动态规划的经典案例之一,而0/1背包更是其中的代表。它描述了这样一个场景:你有一个固定容量的背包,面对n件物品,每件物品要么装入背包(1),要么放弃(0)。每个物品都有自己的重量和价值,如何选择才能让背包中的物品总价值最大?
🌟 动态规划的核心思路
解决0/1背包问题的关键在于构建一个二维数组`dp[][]`,其中`dp[i][j]`表示前i件物品放入容量为j的背包时的最大价值。通过递推公式逐步填表,最终得到最优解。代码逻辑简洁且高效,完美体现了动态规划“分阶段决策”的思想。
💻 Java代码实现
```java
public class Knapsack {
public static int knapSack(int W, int[] wt, int[] val, int n) {
int[][] dp = new int[n + 1][W + 1];
for (int i = 0; i <= n; i++) {
for (int w = 0; w <= W; w++) {
if (i == 0 || w == 0)
dp[i][w] = 0;
else if (wt[i - 1] <= w)
dp[i][w] = Math.max(val[i - 1] + dp[i - 1][w - wt[i - 1]], dp[i - 1][w]);
else
dp[i][w] = dp[i - 1][w];
}
}
return dp[n][W];
}
}
```
🎯 总结
0/1背包问题不仅是算法学习的重要内容,更是一种思维模式的体现——用最优子结构解决问题。无论是编程小白还是资深开发者,掌握这种思想都能事半功倍!💪
标签:
免责声明:本文由用户上传,如有侵权请联系删除!