有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。
如,有1 分,3 分,3 分,3 分,4 分五张邮票,要求凑成10 分,则使用3 张邮票:3 分、3 分、4 分即可。
输入:
首先是要求凑成的邮票总值M ,M<100
然后是一个数N ,N 〈20 ,表示有N 张邮票。接下来是N 个正整数,分别表示这N 张邮票的面值,且以升序排列。
输出:
能够凑成总值M 的最少邮票张数。若无解,输出0 。
样例输入:
10 5 1 3 3 3 4 |
样例输出:
3 |
这是一个典型的分步骤的动态规划问题,我们设lm(total,amount)表示前面 amount个邮票组成total总数的最少邮票数,list是邮票的升序列表,则有如下公式成立:
如果有list[amount-1]>total
lm(total,amout)=lm(total,amount-1)
否则有
lm(total,amount)=min(lm(total-list[amount-1],amount-1),lm(total,amount-1))
递归填表可以解决问题,代码如下: