人民币找零
[问题描述]在50元和100元面值的人民币出现之前,人民币仅由10元、5元、2元、1元、5角、2角、1角和5分、2分、1分面值的钱币组成。现给定一个10000元以内,精确到1分的人民币数值,请你用最少的钱币张数,找出相应的钱数。例如:给定钱币数为17元3角2分,则输入数据为17.32,则相应的输出为:
6(钱币总张数,此数应最小)
(以下为各种面值钱币的张数,不需要使用的钱币不必列出) 10 1
5 1
2 1
0.2 1
0.1 1
0.02 1
算法分析:因为可使用的任一面值的钱币数目不限,所以先使用大面值的钱币数,再使用小面值的钱币数。
硬币问题
[问题描述]将C (1 <= C <= 1000)分用最少的N(1 <= N<= 10)种不同价值的硬币表示。假如有5种硬币,价值分别为50, 25, 10, 5和1分,93分最少的方法是用1个50, 1个25, 1个10, 1个 5,和3 个 1 分的硬币 (共7个硬币)。
输入格式:第一行:两个用空格隔开的整数:C和N
第2..N+1行:每行包含一个整数表示这
种硬币的价值。
输出格式:一行:一个整数表示最少要几个硬币表示C分
样例输入:93 5 样例输出:
25 7
50
10
1
5
算法分析:
样例用前例所讲的贪心策略无疑是正确的,但我们可以举出反例。例如:共有3种硬币,分别是6分,5分,1分,确定10分最少需要几个硬币。运用前面的贪心策略先选1个6分的,再用4个1分的,共5个硬币。但我们显然可以用两个5分硬币表示10分。本题正确的算法应该是动态规划。
贪心用于动态规划
贪心法和动态规划是信息学竞赛中的常用经典算法,而当某些问题的模型过于复杂的时候,由于状态过于庞大、转移困难等一系列的问题,常规的动态规划难于甚至无从下手。而在这个时候,巧妙的使用贪心思想,将其融入到动态规划的解题中,动态规划便焕发出了新的光彩。
随机化贪心解决NP问题
贪心法的时间复杂度是相当小的,它没有充分利用时间,因此得到最优解的概率不大;如果能够贪心多次而得到不同的结果,最后取其中的最优,得到最优解的概率就会大大增加 ,于是引入随机化算法 。
数据结构中几种典型的贪心算法:
1. 哈夫曼(Huffman) 编码
2. 库鲁斯卡尔(Kruskal) 算法
3. 普利姆(Prim) 算法