背包问题模板

一句话说明

背包问题是动态规划的经典问题,核心是选或不选的决策。

💻 模板代码

🎯 背包问题分类

类型特点遍历顺序状态转移
0-1背包每个物品选一次后向前max(dp[c], dp[c-w]+v)
完全背包每个物品选无限次前向后max(dp[c], dp[c-w]+v)
多重背包每个物品选k次二进制优化转化为0-1背包
分组背包每组最多选一个后向前枚举组内物品

🎯 经典变形

💡 解题技巧

Go 代码

// 0-1背包
func knapsack01(weights, values []int, capacity int) int {
    dp := make([]int, capacity+1)
 
    for i := 0; i < len(weights); i++ {
        for c := capacity; c >= weights[i]; c-- {
            dp[c] = max(dp[c], dp[c-weights[i]]+values[i])
        }
    }
 
    return dp[capacity]
}
 
// 完全背包
func knapsackComplete(weights, values []int, capacity int) int {
    dp := make([]int, capacity+1)
 
    for i := 0; i < len(weights); i++ {
        for c := weights[i]; c <= capacity; c++ {
            dp[c] = max(dp[c], dp[c-weights[i]]+values[i])
        }
    }
 
    return dp[capacity]
}
 
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

返回:算法模板