专题:0/1背包问题(0/1 Knapsack)模式

本文介绍了0/1背包问题的基本概念,强调了其作为动态规划问题的特点,并通过LeetCode上的具体题目,如'分区使序列和相等'、'零一矩阵'和'目标和',展示了如何将这些问题转化为0/1背包问题来解决。文章提供了状态转移方程和相关代码示例,帮助读者理解解题框架。

背包问题是一类经典的动态规划问题,它非常灵活,需要仔细琢磨体会,本文对背包问题中基本的0/1背包问题和对应的leetcode题目作一个总结,期望可以用一套框架解决背包问题。

  1. 01 背包问题:

最基本的背包问题就是 01 背包问题:背包承重为 Capacity, 现在有n个物品,物品重量 w[n], 物品价值 v[n]。如何选择物品价值最大?

特点:每种物品仅有一件,可以选择放或不放, 即0/1.

1.1 背包问题具备的特征:

是否可以根据一个 target(直接给出或间接求出),target 可以是数字也可以是字符串,再给定一个数组 arrs,问:能否使用 arrs 中的元素做各种排列组合得到 target。

1.2 背包问题解法:

如果是 01 背包,即数组中的元素不可重复使用,外循环遍历 arrs,内循环遍历 target,且内循环倒序:

下面给出0/1背包基本问题的DP方法代码:

// 0/1 背包问题
// 背包承重为 Capacity, 现在有n个物品,物品重量 w[n], 物品价值 v[n]。如何选择物品价值最大?
// 特点:每种物品仅有一件,可以选择放或不放, 即0/1.
// 背包承重量10,5件物品,重量[2,3,3,4,6], 价值[1,2,5,9,4].
public static int maxValue(int C, int[] W, int[] V) {
    int[][] dp = new int[W.length][C + 1]; // dp[i][j]表示0 ~ i 件物品中任意取,背包容积为j的最大价值为dp[i][j]

    // 先处理表格中第一行
    // 从背包容量为0开始到背包满了,检查第0号物品能否放入背包
    for (int j = 0; j <= C; j++) {
        dp[0][j] = (j >= W[0]) ? V[0] : 0;
    }

    for (int i = 1; i < W.length; i++) // 外循环遍历arrs
        for (int j = 0; j <= C; j++) {  // 内循环遍历target
       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值