凑零钱问题_记忆录优化(C++版本)
凑零钱问题:
给定k种面值的硬币,分别是c1,c2, … , ck,每种硬币的数量无限,请问最少需要多少枚硬币可以凑出总金额total,如果凑不出将返回-1.
C++实现函数如下:
int leastCoinNum(vector<int>& coins, int n, map<int, int>&memo)
{
if (n == 0)return 0;
if (n < 0) return -1;
int res = INT_MAX;
map<int, int>::iterator iter;
iter = memo.find(n);
if (iter != memo.end())
return res = iter->second;
for (auto coin : coins)
{
if (n >= coin) {
res = min(res,1+leastCoinNum(coins, n - coin,memo));
}
}
memo.insert(make_pair(n, res));//memo存储给定金额的的最少零钱个数,防止多次计算
return res;
}