程序员面试金典: 9.9 递归和动态规划 9.8求n分可以由25分,10分,5分,1分的硬币的表示方法

#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)*...
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值