关键词: 动态规划
一般题 :不同整数,没有负数
注意题目每个数可以用无数次,不同顺序是不同的组合
动态规划 如果有数x, dp[i] += dp[i-x]
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int n = nums.size();
vector<int> dp(target+1,0);
dp[0] = 1;//注意为0的组合设为一种,即空组合
for(int i=1;i<=target;++i){
for(int j=0;j<n;++j){
if (i < nums[j])
continue;
dp[i] += dp[i-nums[j]];
}
}
///
return dp[target];
}
};
//第一版代码RE了,原因是int溢出
题目里说结果保证在int,那只是说dp[target]在int范围,中间可能有溢出的;
看看这个解释
第二版代码
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
int n = nums.size();
vector<int> dp(target+1,0);
dp[0] = 1;//注意为0的组合设为一种
for(int i=1;i<=target;++i){
for(int j=0;j<n;++j){
if (i < nums[j] || dp[i-nums[j]] >= INT_MAX - dp[i])
continue;
dp[i] += dp[i-nums[j]];
}
}
///
return dp[target];
}
};
如果考虑相同整数,可以先排序然后+判断;