目录
518 零钱兑换 ||
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
class Solution {
public:
int change(int amount, vector<int>& coins) {
vector<int> f(amount + 10);//拼凑成总金额为i的总情况数
f[0] = 1;
for(int i = 0;i < coins.size();i++){
for(int j = coins[i];j <= amount;j++){
f[j] += f[j - coins[i]];
}
}
return f[amount];
}
};
时间复杂度O(n^m)n为amount的大小,m为coins的长度
空间复杂度O(n)
377 组合总和 Ⅳ
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
class Solution {
public:
int combinationSum4(vector<int>& nums, int target) {
vector<int>f(target + 1);
f[0] = 1;
for(int i = 0;i <= target;i++){
for(int j = 0;j < nums.size();j++){
if(i >= nums[j] && f[i] < INT_MAX - f[i - nums[j]])//否则会越界
f[i] += f[i - nums[j]];
}
}
return f[target];
}
};
时间复杂度O(n^m)n为target的大小,m为nums的长度
空间复杂度O(n)