每日一题--多属性的01背包问题

这篇博客介绍了如何解决多属性01背包问题,该问题涉及物品的两个属性(例如0和1),背包容量由二维数组表示。作者首先阐述了三维空间实现的动态规划解决方案,然后通过滚动数组优化将三维空间缩减到二维空间,减少了空间消耗。优化后的算法通过逆向遍历背包容量来达到相同的效果。
摘要由CSDN通过智能技术生成

题目

在这里插入图片描述

题目详解

什么是多属性的背包问题?比如对于这道题,它可以看作是一个具有装下物品两个属性的背包(装下0和1),它的容量可以看作是[j][k]可用二维数组来表示,而外面一层和普通的01背包问题一样,用于表示在有多少个物体的情况下装下物体的个数

  • 那么dp数组定义如下–dp[i][j][k]表示给出前i个物体,并且背包容量为[i][k](装下1和0的容量)的情况下所能装下的最多物体,由于对于每个物体是一个字符串,每个字符串有0或者1两种属性,可设计一个函数用于专门求0和1 的个数
  • 对于此题dp关系为:dp[i][j][k] = dp[i-1][j][k](no pack)+dp[i-1][j-count(0)][k-count(1)](pack).
  • 最后由于是背包问题base case肯定是背包容量为0以及给出物品数为0的情况,即dp[0][..][..] = 0,dp[..][0][0] = 0,根据三维空间画图可知遍历方向是从左往右从下往上.

三维空间实现多属性01背包

class Solution {
   
public:
//三维数组实现dp关系
//用于计数每个字符串的0和1用长度为2的数组返回
    vector<int> getZerosOnes(string& str) {
   
        vector<int> zerosOnes(2);
        int length = str.length();
        for (int i = 0; i < length; i++) {
   
            zerosOnes[str[i] - '0']++;
        }
        return zerosOnes;
    }

    int findMaxForm(vector<string>& strs, int m, int n) {
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值