思路——动态规划
- 无需打印路径的使用动态规划代替回溯
- dp[j]含义:target为j时,使用[0~i]的排列数
- 递推公式:dp[j]+=dp[j-num[i]]
- dp初始化,第一个元素为1,其他元素为0
- 遍历顺序:先背包后物体(排列) 先物体后背后(组合)
代码
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int> dp(target+1);
//初始化
dp[0]=1;
//排列数 先背包后物体
for(int j=0;j<target+1;++j)
for(int &i:nums)
//防止结果出界
if(j>=i&&dp[j-i]<INT_MAX-dp[j]) dp[j]+=dp[j-i];
//返回结果
return dp[target];
}
};