【动态规划】之硬币找零问题(难度:1星)
来源:互联网 发布:易语言整人源码大全 编辑:程序博客网 时间:2024/06/08 16:01
#include <stdio.h>/** * 原题: * 假设有几种硬币,如1块、3块、5块,并且数量无限。 * 请找出能够组成某个数目的找零所使用最少的硬币数。 */#define MIN(x,y) (x<y?x:y)#define INF 50000 //一个很大的值,这里可看作无限大#define N 5 //有5种硬币#define K 22 //目标为K块static int a[N] = {1,3,5,6,7}; //每种硬币的面值/** * 我的思路如下 * 设子问题为:请求出用N种硬币,能够组成目标数值k(k<=K)的最小硬币数minSum * 找出边界:显然k=0时,minSum=0,因为凑够0元需要的硬币数肯定是0个 *///最容易想到的是递归int solve_1(int k){ if (k == 0) return 0; int minSum = INF; for (int i = 0; i < N; ++i) { //如果当前硬币面值不大于目标值,比较并求出最小的硬币数 if (k >= a[i]) { minSum = MIN(minSum, solve_1(k - a[i]) + 1); } } return minSum;}//solve_1基础上可以加一个记忆数组static int memo[K+1];int solve_2(int k){ if (memo[k] < INF) return memo[k]; if (k == 0) return memo[k] = 0; int minSum = INF; for (int i = 0; i < N; ++i) { //如果当前硬币面值不大于目标值,比较并求出最小的硬币数 if (k >= a[i]) { minSum = MIN(minSum, solve_2(k - a[i]) + 1); } } return memo[k] = minSum;}//改良solve_2成为递推static int minSum[K+1];int solve_3(){ minSum[0] = 0; for (int i = 1; i <= K; ++i) { minSum[i] = INF; } for (int i = 1; i <= K; ++i) { for (int j = 0; j < N; ++j) { //如果当前硬币面值不大于目标值,比较并求出最小的硬币数 if (i >= a[j]){ minSum[i] = MIN(minSum[i], minSum[i-a[j]] + 1); } } } return minSum[K];}int main() { printf("solve_1:%d\n", solve_1(K)); for (int i = 0; i < K+1; ++i) { memo[i] = INF; } printf("solve_2:%d\n", solve_2(K));// for (int i = 0; i < K+1; ++i) {// printf("%d ", memo[i]);// } printf("\nsolve_3:%d\n", solve_3());// for (int i = 0; i < K+1; ++i) {// printf("%d ", minSum[i]);// } return 0;}
运行结果:
solve_1:4solve_2:4solve_3:4
阅读全文
1 0
- 【动态规划】之硬币找零问题(难度:1星)
- 动态规划入门之硬币找零问题
- 动态规划之最少硬币找零问题
- 硬币找零问题 - 动态规划
- 硬币找零问题 动态规划问题
- 动态规划算法求解硬币找零问题(1)
- 硬币找零问题(动态规划)
- 硬币找零问题(动态规划求解)
- 最少硬币找零问题-动态规划
- 最少硬币找零问题-动态规划
- 动态规划算法求解硬币找零问题
- 动态规划之找零问题
- 动态规划之找零问题
- 硬币找零(动态规划)
- 动态规划求解硬币找零问题——Java实现
- 动态规划算法求解硬币找零问题(Java)
- 动态规划算法求解硬币找零问题(Java)
- JAVA动态规划(一)--最少硬币找零问题
- 以太坊平台搭建
- Gtest/Gmock探究(一)-- 经典示例代码
- Android 的lowmemorykiller机制
- [翻译]理解/检测 Inline Hooks/ WinAPI Hooks (Ring3)
- 【转载】性能分析之看专业的,来进步
- 【动态规划】之硬币找零问题(难度:1星)
- 递归和非递归实现规律函数
- HDU
- android 4.4模拟器java代码设置隐藏drawableRight失败
- 原生js干货
- Hg修改username和email(提交代码后显示)
- 树的同构
- uva 673 括号匹配
- MyBatis3框架学习(1)----mybaits初识和第一个helloworld