问题描述:假设有 1 元,3 元,5 元的硬币若干(无限),现在需要凑出 11 元,问如何组合才能使硬币的数量最少?
解题思路:
1、动态规划
假设总价值为i,先假设一个函数d(i)来表示需要凑出i的总价值需要的最少硬币数量。
当i=0时,我们不需要拼凑硬币,因为总价值为0
当i=1时,因为有1元我们需要1个1元,所以d(1)=1。
当i=2时,因为没有2元,所以我们需要2个1元,d(2)=2.
当i=3时,因为有3元,所以我们需要1个3元就好了,d(3)=1.
….
可以看出,除了第一步以外,往后的结果都建立在它之前得到的某一步的最优解上再加上1个硬币得出。比如d(1)=d(0)+1,d(2)=d(1)+1,d(3)=d(0)+1.
所以d(i) = d(j)+1 j < i
(1)假设最后加上的是 1 元硬币,那 d(i) = d(j) + 1 = d(i - 1) + 1。
(2)假设最后加上的是 3 元硬币,那 d(i) = d(j) + 1 = d(i - 3) + 1。
(3)假设最后加上的是 5 元硬币,那 d(i) = d(j) + 1 = d(i - 5) + 1。
需要凑18元时,我们首先找18-1=17,18-3=15,18-5,=13;再找17-1……。这样递归解决子问题
//money需要凑的钱
//coin可用的硬币
//硬币种类
void FindMin(int money,int *coin, int n,int *&Num,int *&Values)
{
Num[