很标准的动态规划,容易得到递推公式dp(i)=dp(i-num[0])+dp(i-num[1])+......dp(i-num[n])。
也就是最后一个数字可以是数组中的任何一个小于target的数字,然后把所有的加起来
比如例子{1,2,3,4},则dp(4)=dp(0)+dp(1)+dp(2)+dp(3),分别为最后一步选择4,3,2,1,然后转化成了子问题
需要注意的是给定数组不一定连续
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
sort(nums.begin(), nums.end());
vector<int>dp(target + 1, 0);
dp[0] = 1;
for (int i = 1; i <= target; ++i)
{
for (int j = 0; j < nums.size() && i >= nums[j]; ++j)
dp[i] += dp[i - nums[j]];
}
return dp[target];
}
};