Leetcode 474 一和零 二维费用的背包问题

该博客讨论了一种使用动态规划求解最多容纳特定数量0和1的字符串子集的最大数量的方法。代码实现中,f[i][j]表示最多容纳iii个0和jjj个1的字符串数量。通过遍历所有字符串并更新状态转移矩阵,找到最大可能的子集数量。

题目链接
在这里插入图片描述
1.确定状态: f [ i ] [ j ] f[i][j] f[i][j]:表示最多容纳 i i i 个 0, j j j 个 1,属性表示最多容纳的字符串数量。
2.状态转移:当 i i i j j j 的容量都大于当前字符串中 0 和 1 的数量的时候,当前字符串可以选择,否则不能选,即状态转移 f [ i ] [ j ] = m a x ( f [ i ] [ j ] , f [ i − 当 前 字 符 串 0 的 数 量 ] [ j − 当 前 字 符 串 1 的 数 量 ] + 1 ) f[i][j]=max(f[i][j],f[i-当前字符串0的数量][j-当前字符串1的数量]+1) f[i][j]=max(f[i][j],f[i0][j1]+1);

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        vector<vector<int>> f(m+1, vector<int>(n+1));
        for(auto& x : strs)
        {
            int zero = 0, one = 0;
            for(auto y : x) 
                if(y == '1') one++;
                else zero++;
            for(int i = m; i >= zero; --i)
                for(int j = n; j >= one; --j)
                    f[i][j] = max(f[i][j], f[i-zero][j-one] + 1);
        }
        return f[m][n];
    }
};
### LeetCode 上的背包问题及相关解法 #### 01 背包问题概述 在 LeetCode 中,常见的背包问题是 01 背包问题。这类问题的特点是给定组物品,每个物品有个重量个价值,在限定总重量的情况下如何选择这些物品使得所选物品的总价值最大[^3]。 #### 动态规划解决方法 针对此类问题的种经典解决方案是动态规划 (Dynamic Programming, DP) 方法。通过构建二维数组 `dp` 来存储不同状态下的最优解: - 行表示考虑前 i 个物品的状态; - 列代表当前剩余容量 j 的情况下可以获得的最大价值。 初始化时设置 dp 数组的第列为全(即当没有可用空间时无法获取任何价值)。对于每个新加入考量范围内的物品 k,更新对应的 dp 值如下所示: ```python for i in range(1, n+1): # 对于第i个物品 for w in reversed(range(W)): # 反向遍历可能的承重w if weights[i-1] <= w: dp[w] = max(dp[w], dp[w - weights[i-1]] + values[i-1]) ``` 这里采用了逆序迭代的方式防止重复计算已经处理过的组合情况。 #### 特殊变种案例探讨 值得注意的是,并不是所有的背包类题目都严格遵循标准形式。某些特定条件下可能会引入额外约束条件或者改变目标函数定义方式。例如有的题目会要求恰好填满整个背包;还有些则允许部分填充甚至存在负数权重等情况[^2]。 #### 实际应用实例解析 以道具体的 LeetCode 题目为例来说明上述理论的应用场景——最小相对损失购买巧克力问题。此题虽然表面上看起来像是简单的贪心算法就能搞定的任务,但实际上涉及到更复杂的逻辑推理过程以及边界情况处理技巧[^4]。 #### 提供更多思考角度 除了传统的动规之外,还可以尝试其他创新性的思维方式去解决问题。比如利用排序加前缀配合二分查找技术实现高效求解方案。这种方法不仅能够有效降低时间复杂度而且更容易理解编码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

幸愉信奥

谢谢亲的支持,我会继续努力啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值