4399后端笔试题第三题
题目:给定不同面额的硬币coins和每种硬币的数量counts,以及一个总金额amount
编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回-1.
示例输入
1 2 5// 硬币面额coins
3 2 1// 每种面额对应的数量counts
11// 总金额amount
示例输出
5
#include <vector> #include <iostream> using namespace std; // count为硬币个数 // sum为当前和 int backtracking(int &count, vector<int> coins, int startindex, int sum, int amount) { if (startindex == coins.size()) { return -1; } if (sum == amount) {// 当前和满足amount,立即返回 return sum; } for (int i = startindex; i < coins.size(); ++i) { if (sum + coins[i] > amount) continue; count++; sum += coins[i]; if (backtracking(count, coins, i + 1, sum, amount) == amount) return amount; sum -= coins[i]; count--; } } int main() { vector<int> coins = { 1, 2, 5 }; vector<int> counts = { 3, 2, 1 }; vector<int> new_coins;// new_coins为整合为一个并且排序好的从大到小的硬币数组 for (int i = counts.size() - 1; i >= 0; --i) { int numbers = counts[i];// 最大硬币的个数 for (int j = 0; j < numbers; ++j) { new_coins.emplace_back(coins[i]);// 将最大的硬币放入数组最前面 } } int result{}; backtracking(result, new_coins, 0, 0, 11); if (result == 0) result = -1; cout << result << endl; return 0; }
}
#4399#