文章目录
题目
题目详解
什么是多属性的背包问题?比如对于这道题,它可以看作是一个具有装下物品两个属性的背包(装下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) {