第6章过程封装--函数.ppt

第6章过程封装--函数.ppt

解法1 --分治法 如果我们可以用一个硬币找零,这就是最小的。 否则,对于每个可能的值i,我们可以独立计算找i分钱零钱和K-i分钱需要的最小硬币数。然后选择这个和最小的i。 怎样找出63分钱零钱 找出1分钱零钱和62分钱零钱分别需要的硬币数是1和4。因此,63分钱需要使用五个硬币。 找出2分钱和61分钱分别需要2和4个硬币,一共是六个硬币。 我们继续尝试所有的可能性。我们看到一个21分和42分的分解,它可以分别用一个和两个硬币来找开,因此,这个找零问题就可以用三个硬币解决。 我们需要尝试的最后一种分解是31分和32分。我们可以用两个硬币找出31分零钱,用三个硬币找出32分零钱,一共是五个硬币。 因此最小值是三个硬币。 int coin(int k) { int i, tmp, int coinNum = k; if (能用一个硬币找零) return 1; for (i=1; ik; ++i) if ((tmp = coin(i) + coin(k-i)) coinNum)     coinNum = tmp; return coinNum; } 上述解法分析 此算法的效率很低 事实上63分钱找零的问题是不会在一个合理的时间内解决的。就如Finbonacci 函数一样 解法2 通过指定其中的一个硬币来递归地简化问题。 例如,对于63分钱,我们可以给出以

文档评论(0)

1亿VIP精品文档

相关文档