Problem: 377. 组合总和 Ⅳ
思路
组合排列数的递推公式: dp[i] += dp[i - nums[j]];
(推导思路可以参考这篇文章)
外层遍历物品, 内层遍历背包 → 组合数
外层遍历背包, 内层遍历物品 → 排列数
进行验证→手动模拟一遍
Code
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1, 0); // dp[i]的含义是nums中数值相加为i的排列的数量
dp[0]=1;
for(int j = 0; j <= target; ++j)
{
for(int i = 0; i < nums.size(); ++i)
{ // dp[j] < INT_MAX - dp[j-nums[i]] 因为C++有测试样例溢出,这里做下处理
if(j - nums[i] >= 0 && dp[j] < INT_MAX - dp[j-nums[i]])
dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
};