#include <iostream>
#include <stdio.h>
using namespace std;
/*
问题:给定数量不限的硬币,币值为25分、10分、5分和1分,编写代码计算n分有几种表示法。
分析:因为此题中的硬币数量满足,相邻面值中较高的设为h,较小的为l,有h>=2*l,则任意较高面值的可以→较低的面值表示
则简单的实现就是用贪心法来做。贪心满足两个原则:
1)贪心选择:全局最优解可通过局部最优解得到。每次选择,生成局部最优解,将问题转化为规模更小的子问题
2) 最优子结构:问题最优解包含其子问题最优解。
贪心的特点:必定按照从大较小或从小较大某种顺序来
证明贪心选择:设货币分别为P={p1,p2,..,pn},假设n>p1,选择p1,
选择的隐蔽集合是S1={p1},得到一个局部解,问题转化为在P1={p2,..,pn}中挑选货币支付n-p1
证明最优子结构:假设结果为Sn={p1,p2,p3,p4},子问题的最优解为
Sn-1={p2,p3,p4},有Sn-1U{p1}=Sn,即问题最优解包含子问题最优解
分析:假如n=1,那么必定只有1种
假如n=5,有两种:本身5,和用5个1表示
假如n=10,有5种:10,2个5,1个5和5个1,5个1和1个5,10个1
分析得到:f(10)=f(5)*f(5) +
设为n,则必定被<=n的最大的数表示,记为k1,k2,....,kn
P = {p1,p2,..,pn}
f(n) = f(k1)*f(k2)*...
程序员面试金典: 9.9 递归和动态规划 9.8求n分可以由25分,10分,5分,1分的硬币的表示方法
这篇博客讨论了如何使用递归和动态规划解决硬币找零问题。具体场景是用面值为25分、10分、5分和1分的硬币找零,通过分析和代码实现展示了如何计算不同面值硬币组合的表示方法。递归函数`makeChange`通过不断调整硬币面值和数量,找出所有可能的组合。
摘要由CSDN通过智能技术生成