换零钱

Posted 我只有一件白T恤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了换零钱相关的知识,希望对你有一定的参考价值。

问题描述:现存在一堆面值为 1,2,5,11,20,50 面值的硬币,问最少需要多少个硬币才能找出总值为N个单位的零钱。

解决这个问题其实也可以考虑使用贪心算法,每次使用面值最大的硬币,不足部分再用小额硬币补充。以兑换63元为例,可选择的硬币和方案为50+11+2。但是,使用贪心算法只能保证每一步取的是局部最优解,并不能保证最终结果是全局最优解。以兑换15元为例,贪心算法给出的组合方案为{11,1,1,1,1},但其实最优方案为{5,5,5}

使用动态规划算法就能避免该问题。因为动态规划可以保证每次取到的子问题的解是最优解。

上述文字引用来着》》这里《《

 

思路:直接DFS将每一种情况进行遍历好像有点儿暴力,但是似乎真的很好理解。然后打算在进行DP写一遍,给人家DP入门题一点面子是不是。然后我发现这个我写了好像就是DP??

  • DFS+DP题解:
#include<map>
#include<string>
#include<climits>
#include<iostream>
using namespace std;
int money[] = { 1, 2, 5, 11, 20, 50 };
long long dfs(int n)
{
    if (n <= 0)return 0;
    long long min = INT_MAX;
    for (int i = 0; money[i] != \0; i++){
        if (n - money[i] > 0){
            int temp = dfs(n - money[i]) + 1;
            if (temp < min)min = temp;
        }
        if (n - money[i] == 0)return 1;
    }
    return min;
}
int main()
{
    int n; 
    while (cin >> n){
        cout << dfs(n) << endl;
    }
    return 0;
}

以上是关于换零钱的主要内容,如果未能解决你的问题,请参考以下文章

python 换零钱

透析递归应用-换零钱

51 nod 1101 换零钱

贪心算法换零钱(java)

51nod 1101 换零钱 完全背包的变型 动态规划

习题4-5 换硬币 (20分)