seo站内站怎么做厦门seo代运营
leetcode:377. 组合总和 Ⅳ - 力扣(LeetCode)
题目
给定一个由正整数组成且不存在重复数字的数组,找出和为给定目标正整数的组合的个数。
示例:
- nums = [1, 2, 3]
- target = 4
所有可能的组合为: (1, 1, 1, 1) (1, 1, 2) (1, 2, 1) (1, 3) (2, 1, 1) (2, 2) (3, 1)
请注意,顺序不同的序列被视作不同的组合。
因此输出为 7。
思路
这里跟上面那道题的区别在于 “排列!”
排列强调排序顺序,所以先遍历背包,再遍历物品。
物品就是nums数组的每一个元素nums[i]
物品对应的容量也是nums[i]
背包最大容量是target
递推公式为 dp[j] += dp[j-nums[i]];
直接给出代码:
class Solution
{
public:/*** 计算给定数组nums中元素的组合之和等于target的组合数。* 本函数使用动态规划的方法解决问题,避免了重复计算和回溯。* * @param nums 包含不同正整数的数组。* @param target 目标和。* @return 组合数。*/int combinationSum4(vector<int> &nums, int target){// 初始化一个长度为target+1的数组dp,用于存储所有和为i的组合数。vector<uint64_t> dp(target + 1);// 基础情况:和为0的组合数为1,即什么都不选。dp[0] = 1;// 外层循环遍历所有可能的和,从1到target。for (int j = 0; j <= target; j++){// 内层循环遍历数组nums中的每个元素。for (int i = 0; i < nums.size(); i++){// 如果当前元素nums[i]小于等于当前和j,则可以将nums[i]加入组合中。if (j >= nums[i])// 更新dp[j],增加以nums[i]结尾的组合数。dp[j] += dp[j - nums[i]];}}// 返回目标和为target的组合数。return dp[target];}
};
总结
参考资料
代码随想录