思路:动态规划,初值即总和为0的组合设定为1,然后从1到target开始推导,一个一个遍历数组,进行讨论,要注意的是溢出情况。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
sort(nums.begin(),nums.end());
vector<int> dp(target+1);
//设初值
dp[0]=1;
//开始讨论从1到target的值
for(int i=1;i<=target;++i)
{
//遍历数组
for(int j=0;j<nums.size()&&nums[j]<=i;++j)
{
//注意溢出
if(dp[i]<=INT_MAX-dp[i-nums[j]])
//推导关键式
dp[i]+=dp[i-nums[j]];
}
}
return dp[target];
}
};
本来是利用回溯来着,超时。动态规划好理解,就是推导式有时候比较难想到。