思路——动态规划
- 无需打印路径的使用动态规划代替回溯
- 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];
}
};
本文介绍如何利用动态规划避免回溯,计算给定整数数组中,和为目标值的组合总数。通过定义dp[j]表示目标和为j时的排列数,并利用背包与排列的顺序,递推求解。关键在于初始化和边界条件的处理,最后返回dp[target]作为结果。
899

被折叠的 条评论
为什么被折叠?



