题目描述:
方法1:排列形式的完全背包问题
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int>dp(target+1,0);
dp[0] = 1;
for(int j=1;j<=target;j++){
for(int i=0;i<nums.size();i++){
if(j>=nums[i]) dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
};
出错,用例有两个数相加溢出int
修改:在if里加上dp[j] + dp[j - nums[i]]< INT_MAX
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int>dp(target+1,0);
dp[0] = 1;
for(int j=1;j<=target;j++){
for(int i=0;i<nums.size();i++){
if(j>=nums[i] && (dp[j] + dp[j-nums[i]] < INT_MAX)) dp[j] += dp[j-nums[i]];
}
}
return dp[target];
}
};
出错,还是同样的问题,因为dp[j] + dp[j - nums[i]]已经发生,任然会溢出,改为dp[j] < INT_MAX - dp[j - nums[i]]