下面土嘎嘎小编分享使用动态规划算法求解 0/1 背包问题的伪代码:
function knapsack(weights, values, capacity):
n = length(weights) // 物品数量
dp = new 2D array[0..n][0..capacity] // 创建一个二维数组用于记录状态
// 初始化边界条件
for i = 0 to n:
dp[i][0] = 0 // 背包容量为0时,价值为0
for w = 0 to capacity:
dp[0][w] = 0 // 没有物品可选时,价值为0
// 动态规划状态转移
for i = 1 to n:
for w = 1 to capacity:
if weights[i-1] <= w: // 当前物品能够放入背包
dp[i][w] = max(values[i-1] + dp[i-1][w - weights[i-1]], dp[i-1][w])
else: // 当前物品无法放入背包
dp[i][w] = dp[i-1][w]
return dp[n][capacity] // 返回最大价值
这段伪代码中,我们使用一个二维数组 dp 来记录每个子问题的最优解。在状态转移过程中,我们从背包容量为0开始逐步增加,对于每个物品,我们计算选择该物品和不选择该物品两种情况下的最大价值,并更新状态数组 dp 。
最后,返回 dp[n][capacity] 即代表背包能够装下的最大价值。其中, weights 数组存储物品的重量, values 数组存储物品的价值, n 表示物品的数量, capacity 是背包的容量。
要注意的是,以上伪代码中的索引从 0 开始,因此在实际实现时,可能需要根据具体编程语言对数组索引进行适当的调整。