换零钱

问题描述:现存在一堆面值为 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;
}
posted @ 2018-04-24 22:10  我只有一件白T恤  阅读(170)  评论(0编辑  收藏  举报