01背包问题简介

01背包问题 是动态规划算法中非常经典的一个问题,广泛应用于优化选择场景。它描述的是:给定一组物品(每个物品有重量和价值),以及一个最大承重能力的背包,在不超过背包容积的前提下,如何挑选这些物品使得装入背包中的总价值最高。

基本要素
  • n件物品
  • 每一件都有两个属性:
    • weight[i] 表示第 i 物品的重量;
    • value[i] 表示该物品的价值。
  • 背包的最大承载量为 W;目标是在满足重量限制的情况下获得最大的总价值 Vmax.
动态规划解决思路

采用二维数组 dp 来存储中间结果,其中dp[i][w]表示前i个元素放入容量为 w 的背包所能得到的最大值:

def knapsack(weights, values, capacity):
    n = len(values)
    
    # 创建DP表并初始化
    dp = [[0 for _ in range(capacity + 1)] for __ in range(n + 1)]

    # 构建DP表
    for i in range(1, n + 1):       # 遍历所有商品
        for j in range(capacity + 1):# 对于每一个体积j
            if weights[i-1] > j:      # 如果当前物体太大放不下,则不选此物
                dp[i][j] = dp[i-1][j]
            else:
                dp[i][j] = max(dp[i-1][j],     # 不选取这个物件的情况下的最优解
                               dp[i-1][j-weights[i-1]]+values[i-1])   # 选取后的最优解
    
    return dp[n][capacity]

上述代码实现了最基础版的01背包解决方案,通过构建一个表格逐步填充来解决问题,并最终返回可以获取到的最大价值。

算法特点及应用场合

这种类型的题目非常适合用来练习递归思想、记忆化搜索与自底向上式的动态规划技巧。除了传统的背包模型外,还可以推广至其他组合优化领域,例如资源分配等实际应用场景之中。

你可能感兴趣的:(python)