法1:动态规划
想法:
- target 为背包
- nums 中的正整数为物品,正整数的值为物品体积,物品可以无限次放入
- dp数组保存目标数为 0 到 target 时的组合个数(初始化dp[0]为1,方便后续组合个数的计算。比如:如果 target 存在于 nums 中,则正好装得下,dp[target]++;因为都采取的dp[target] + 剩余容量组合数(此时剩余容量为0),所以dp[target]会加上dp[0],则dp[0]默认为1)
/**
* @param {number[]} nums
* @param {number} target
* @return {number}
*/
var combinationSum4 = function(nums, target) {
// target 为背包
// nums 中的正整数为物品,正整数的值为物品容量,物品无限
var dp = [], i = 0, j = 0;
for(i = 0; i <= target; i++) {
dp[i] = 0;
}
dp[0] = 1;
for(i = 1; i <= target; i++) { // 对于容量为 1 到 target 的背包
for(j = 0; j < nums.length; j++) { // 对于当前体积物品
if(i >= nums[j]) { // 如果装得下,则装入
dp[i] += dp[i - nums[j]];
}
}
}
return dp[target];
};