Ⅰ:凑零钱问题:
①给出不重复的数组 coins 表示硬币的面额,数字 amount 表示需要凑成的金额。如果每种金额的硬币只能用一次,输出所有不重复的可能的组合的总数。
递归:
class Solution {
private:
int helper(vector<int>& coins, int index, int amount)
{
if(amount == 0) return 1;
if(amount < 0 || index >= coins.size()) return 0;
int res = 0;
for (int i = index; i < coins.size(); ++i)
{
if(amount < coins[i]) continue;
res += helper(coins, i + 1, amount - coins[i]);
}
return res;
}
public:
int change(int amount, vector<int>& coins) {
return helper(coins, 0, amount);
}
};
② 如果每种金额的硬币只能使用一次,但是不同的选用顺序被认为是不同的组合,例如{1,2}和{2,1}被认为是不同的组合,输出所有可能的组合的总数。
递归:
class Solution {
private:
vector&