如何解决leetcode 组合 sum 4 可以用背包+递归吗
对于https://leetcode.com/problems/partition-equal-subset-sum
var canPartition = function(ns) {
// sum
const s = ns.reduce((acc,t) => acc+t,0);
// half
condi = s % 2 === 0 ? true : false
if(condi === false) return false;
// sort
ns.sort((a,b) => a-b);
const sum = s/2;
// memo_2D
const dp = [];
for(let i=0; i<ns.length; ++i) {
dp[i] = Array(sum+1).fill(null);
}
return recur(ns,sum,dp);
};
var recur = function(ns,i,tar,dp) {
// ind guard
if(i >= ns.length) return false;
// equal
if(tar === 0) return true;
// over_consume
if(tar < 0) return false;
// if top,this catch everything
if(dp[i][tar] !== null) return dp[i][tar];
// knapsack recur,memo_2D
const res = recur(ns,i+1,tar-ns[i],dp) || recur(ns,dp);
return dp[i][tar] = res;
}
我可以使用背包(选择这个元素与否)+递归。它通过了所有测试用例。
我尝试在以下问题中应用相同的方法(背包 + 递归)。
https://leetcode.com/problems/combination-sum-iv
var combinationSum4 = function(ns) {
const s = ns.reduce((acc,0);
ns.sort((a,b) => a-b);
const sum = s;
// memo_2D
const dp = [];
for(let i=0; i<=sum; ++i) {
dp[i] = Array(ns.length+1).fill(null);
}
return recur(ns,dp) {
if(i >= ns.length) return 0;
if(tar === 0) return 1;
if(tar < 0) return 0;
if(dp[tar][i] !== null) return dp[tar][i];
const res = recur(ns,dp) + recur(ns,dp);
return dp[tar][i] = res;
}
dp 二维数组未填充。
我的问题:
- 是背包问题吗?
- 我们可以用背包+递归来解决吗?
解决方法
我认为 second problem 更像是一个硬币找零类型的 DP 问题(而不是 knapsack + recursion
一个)。下面的代码解决了这个问题:
int combinationSum4(vector<int>& nums,int target) {
vector<int> dp(target+1,0);
dp[0] = 1;
int sz = nums.size();
for(int i=1; i<=target; i+=1) {
for(int j=0; j<sz; j+=1) {
if(i >= nums[j]) dp[i] += dp[i - nums[j]];
}
}
return dp[target];
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。