class Solution {
public:
int findTargetSumWays(vector<int>& nums, int target) {
int sum = 0;
for (int i = 0; i < nums.size(); i++) sum += nums[i];
if ((sum + target) % 2 == 1 || (sum + target) < 0) return 0;
vector<int> value((sum + target) / 2 + 1, 0);
value[0] = 1;
for ( int i = 0; i < nums.size(); i++){
for (int j = value.size() - 1; j >= 0; j--){
if (j >= nums[i]) value[j] = value[j] + value[j - nums[i]];
}
}
return value[value.size() - 1];
}
};
这题是背包问题的一个变种,求取的不是背包的最大重量,而是装下一个重量的方案数,与之前的背包问题的区别在于,动态规划数组中的数据代表的不是最大重量而是方案数,因此迭代时,采取的不是取最大而是求和,迭代方向则是一样的。
class Solution {
public:
int findMaxForm(vector<string>& strs, int m, int n) {
vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
for (string s :strs){
int one = 0, zero = 0;
for(int i = 0; i < s.size(); i++){
if(s[i] == '0') zero++;
else one++;
}
for (int i = m; i >= zero; i--){
for (int j = n; j >= one; j--){
dp[i][j] = max(dp[i][j], dp[i - zero][j - one] + 1);
}
}
}
return dp[m][n];
}
};
这题的背包多一个维度,就是在有两种限制条件的背包中装下最多数量的物品,迭代的思路是一样的。