题目描述:

方法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]]