📅  最后修改于: 2023-12-03 15:41:14.788000             🧑  作者: Mango
给定一个整数数组 nums 和一个目标值 target,求该数组中所有和为 target 的组合数。
注意:一个数可以使用多次。
输入: nums = [1, 2, 3], target = 4 输出: 7 解释: 可以表示的所有组合为: 1+1+1+1 1+1+2 1+2+1 1+3 2+1+1 2+2 3+1
定义一个一维数组 $dp$,其中 $dp[i]$ 表示目标值为 $i$ 时,数组 nums 中所有组合的个数。那么数组 $dp$ 的长度应该是 $target + 1$,因为我们需要统计从 $0$ 到目标值所有情况的个数。
考虑如何更新 dp 数组:遍历数组 nums 中的每个数字,对于数字 $num$,更新 $dp$ 数组中的所有 $dp[i+num] (i+num≤target)$。如果 $i=0$,也就是目标值为 $num$,那么这是一种有效情况,我们需要将 $dp[num]$ 增加 $1$。
最终得到的 $dp$ 数组的最后一个位置即为所有组合的个数。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<unsigned int> dp(target + 1, 0);
dp[0] = 1;
for (int i = 0; i < target; i++) {
if (dp[i] == 0) {
continue;
}
for (const auto& num : nums) {
if (i + num <= target) {
dp[i + num] += dp[i];
}
}
}
return dp[target];
}
};
本题是一道经典动态规划问题,需要多项思考才能解决。同时,本题可以看出,动态规划的两个必要条件:重叠子问题和最优子结构。