给你一个整数数组 coins ,表示不同面额的硬币;以及一个整数 amount ,表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额,返回 -1 。
你可以认为每种硬币的数量是无限的。
示例 1:
输入:coins = [1, 2, 5], amount = 11
输出:3
解释:11 = 5 + 5 + 1
示例 2:
输入:coins = [2], amount = 3
输出:-1
示例 3:
输入:coins = [1], amount = 0
输出:0
示例 4:
输入:coins = [1], amount = 1
输出:1
示例 5:
输入:coins = [1], amount = 2
输出:2
提示:
1 <= coins.length <= 12
1 <= coins[i] <= 231 - 1
0 <= amount <= 104
经典BFS
class Solution {
public:
struct node {
int val;
int num;
};
int coinChange(vector<int>& coins, int amount) {
int n = coins.size();
if (amount == 0) return 0;
if (n == 0 && amount > 0) return -1;
if (n == 0 && amount > 0 && amount%coins[0] != 0) return -1;
int vis[10000+5] = {0};
queue<node> q;
node head = node{amount, 0};
q.push(head);
bool flag = false;
int ans = 0;
while (!q.empty()) {
head = q.front();
q.pop();
for (int i = 0; i < n; ++i) {
node tmp;
tmp.val = head.val - coins[i];
tmp.num = head.num + 1;
//cout << "tmp:" << tmp.val << endl;
if (tmp.val > 0 && vis[tmp.val] == 0) {
vis[tmp.val] = 1;
q.push(tmp);
}
if (tmp.val == 0) {
ans = tmp.num;
flag = true;
break;
}
}
if (flag) break;
}
if (flag) return ans;
else return -1;
}
};