蓝桥每日打卡--背包问题
#蓝桥#JAVA#背包问题
题目描述
有一个背包,它的容量为 W = 4
。有 3 个物品,它们的重量分别为 [2, 1, 3]
,价值分别为 [4, 2, 3]
。问在不超过背包容量的情况下,能装入背包的物品的最大价值是多少?
解题思路
动态规划的核心在于将大问题分解为小问题,并保存小问题的解以避免重复计算。对于背包问题,我们定义一个二维数组 dp[i][w]
表示前 i
个物品放入容量为 w
的背包中所能获得的最大价值。状态转移方程为:
- 当
w < weights[i-1]
时,dp[i][w] = dp[i-1][w]
,即当前物品重量超过背包容量,不能放入,最大价值不变。 - 当
w >= weights[i-1]
时,dp[i][w] = max(dp[i-1][w], dp[i-1][w - weights[i-1]] + values[i-1])
,即可以选择放入或不放入当前物品,取两者中的最大值。
代码实现
def knapsack(weights, values, W):
n = len(weights)
# 创建二维数组 dp
dp = [[0 for _ in range(W + 1)] for _ in range(n + 1)]
# 填充 dp 数组
for i in range(1, n + 1):
for w in range(1, W + 1):
if w < weights[i - 1]:
dp[i][w] = dp[i - 1][w]
else:
dp[i][w] = max(dp[i - 1][w], dp[i - 1][w - weights[i - 1]] + values[i - 1])
return dp[n][W]