https://leetcode-cn.com/problems/combination-sum-iv/
思路:类似于进阶的跳楼梯问题。
d
p
i
dp_i
dpi表示总和为
i
i
i的组合(实际上按照题意应该是排列)个数,那么对于所有的
n
u
m
s
j
nums_j
numsj,只要
n
u
m
s
j
<
=
i
nums_j<=i
numsj<=i就有
d
p
i
=
d
p
i
+
d
p
i
−
n
u
m
s
j
dp_i=dp_i+dp_{i-nums_j}
dpi=dpi+dpi−numsj。初始令
d
p
0
=
1
dp_0=1
dp0=1即可。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<unsigned int> dp(target+1);
dp[0]=1;
int n=nums.size();
for(int i=1;i<=target;i++)
{
for(int j=0;j<n;j++)
if(nums[j]<=i)
dp[i]+=dp[i-nums[j]];
}
return dp[target];
}
};