换零钱
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; }
以上是关于换零钱的主要内容,如果未能解决你的问题,请参考以下文章