动态规划-找零钱问题
问题描述
如果我们有面值为1元、3元和5元的硬币若干枚
问题分析
11-5=6,当需要凑齐6元时,最少的硬币数量方案再加一个5元,就是11元的最佳方案。相当于6元方案再加一个五元硬币。
于是可以得出:
dp(0)=0
dp(1)=dp(1-1)+1=1
dp(2)=dp(2-1)+1=2
dp(3)=dp(3-3)+1=1
dp(4)=dp(4-3)+1=2
dp(5)=dp(5-5)+1=1
dp(6)=dp(6-5)+1=2
dp(7)=dp(7-5)+1=3
dp(8)=dp(8-5)+1=2
dp(9)=dp(9-5)+1=3
dp(10)=dp(10-5)+1=2
dp(11)=dp(11-5)+1=3
根据上述等式可以推理出:
dp(n)=dp(n-可用的最大面值) +1
方案一:
采用动态规划,自底向上计算,保留每一个结果。需要计算从1到11每一个金额的最小硬币方案。
代码:
public static void main(String[] args) throws Exception {
int[] types = {1,3,5};
for(int i=0;i<=11;i++)
exchange(i, types);
}
public static void exchange(int money, int[] types) throws Exception {
List<Integer> parValues = Ints.asList(types);
List<Integer> reference = minResolve(money, parVal

本文探讨了用动态规划和贪心算法解决找零钱问题的方法。通过实例展示了两种策略的计算过程,分析了各自的优势和适用场景。动态规划自底向上计算所有可能,而贪心法每次都选择最大面值硬币,但不保证全局最优解。
最低0.47元/天 解锁文章
371

被折叠的 条评论
为什么被折叠?



