背包问题模版

背包问题模版

0-1背包

  1. 基本定义
    0-1背包问题是一个经典的组合优化问题,其核心描述为:给定一个容量为
    W的背包和 N 个物品,每个物品 i 具有:重量(wi)和价值(vi)
  2. 目标:选择若干物品装入背包,使得:物品的总重量不超过背包容量 W;
    物品的总价值最大化。
  3. 关键特性
    0-1选择:每个物品只能选择放入(1)或不放入(0),不能分割(即不能选择部分物品)。
    不可重复:每个物品最多只能选择一次。
  4. 代码模版示例
public static int knapsack01Optimized(int W, int[] weights, int[] values) {
   
		//一维数组空间优化的模版
        int[] dp = new int[W + 1];
        for (int i = 0; i < weights.length; i++) {
   
            for (int j = W; j >= weights[i]; j--) {
   
            //状态转移方程,不选当前物品:dp[j]保持不变(继承上一轮的结果)。
            /**选当前物品:dp[j - weights[i]] + values[i],
            (腾出weights[i]空间后的最大价值加上当前物品价值)。
            **/
            //取两者的最大值更新dp[j]。
                dp[j] = Math.max(dp[j], dp[j - weights[i]] + values[i]);
            }
        }
        return dp[W];
}

模版题链接:ht

你可能感兴趣的:(算法)