描述
给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1
.
你可以假设每种硬币均有无数个
您在真实的面试中是否遇到过这个题? 是
样例
给出 coins = [1, 2, 5]
, amount = 11
返回 3
(11 = 5 + 5 + 1)
给出 coins = [2]
, amount = 3
返回 -1
#include <iostream>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<algorithm>
using namespace std;
const int N = 100;
const int INF = 2147483640;
int a[N];
int n;
int ans[N];
int main()
{
int amount;
cin >> n;//不同面值货币的数量
cin >> amount;//要拼出的数额值
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
ans[0] = 0;//当面壁数额为0时,需要的货币数初始化为0;
for (int i = 1; i <= amount; i++) {
int pre;
if (i - a[1] < 0) {//如果当前面额数i减去【1】里的面额数小于1的话,说明凑不出来,直接赋正无穷
pre = INF;
}
else {
pre = ans[i - a[1]] + 1;
}
int aim;
for (int j = 2; j <= n; j++) {//遍历除拥有的a【1】货币外剩余的货币面值
if (i - a[j] < 0) {
aim = INF;
}
else {
aim = ans[i - a[j]] + 1;
}
pre = min(pre, aim);//寻找所有方案中最少的那个
}
ans[i] = pre;
}
cout << ans[amount] << endl;
return 0;
}