11.动态规划(4)——找零问题
2017-07-05 23:45
190 查看
找零问题:需找零金额为W,硬币面值有(d1, d2, d3,…,dm),最少需要多少枚硬币。
问题:需找零金额为8,硬币面值有(1, 3, 2, 5),最少需要多少枚硬币。
设F(j)表示总金额为j时最少的零钱数,F(0) = 0,W表示找零金额,有零钱一堆{d1, d2, d3,…,dm}。同样根据之前的经验,要达到为j,那么必然是j – di(1 <= i <= m)面值的硬币数再加1个di面值的硬币,当然j >= di,即F(j) = F(j - di) + 1, j >= di。
[b]Java[/b]
Python3
tag
问题:需找零金额为8,硬币面值有(1, 3, 2, 5),最少需要多少枚硬币。
设F(j)表示总金额为j时最少的零钱数,F(0) = 0,W表示找零金额,有零钱一堆{d1, d2, d3,…,dm}。同样根据之前的经验,要达到为j,那么必然是j – di(1 <= i <= m)面值的硬币数再加1个di面值的硬币,当然j >= di,即F(j) = F(j - di) + 1, j >= di。
[b]Java[/b]
package com.algorithm.dynamicprogramming; import java.util.Arrays; /** * 找零问题 * Created by yulinfeng on 7/5/17. */ public class Money { public static void main(String[] args) { int[] money = {1, 3, 2, 5}; int sum = 8; int count = money(money, sum); System.out.println(count); } private static int money(int[] money, int sum) { int[] count = new int[sum + 1]; count[0] = 0; for (int j = 1; j < sum + 1; j++) { //总金额数,1,2,3,……,sum int minCoins = j; for (int i = 0; i < money.length; i++) { //遍历硬币的面值 if (j - money[i] >= 0) { int temp = count[j - money[i]] + 1; //当前所需硬币数 if (temp < minCoins) { minCoins = temp; } } } count[j] = minCoins; } System.out.println(Arrays.toString(count)); return count[sum]; } }
Python3
#coding=utf-8 def charge_making(money, num): ''' 找零问题 ''' count = [0] * (num + 1) count[0] = 0 for j in range(1, num + 1): minCoins = j for i in range(len(money)): if j - money[i] >= 0: temp = count[j - money[i]] + 1 if temp < minCoins: minCoins = temp count[j] = minCoins return count[num] money = [1, 3, 2, 5] num = 8 count = charge_making(money, num) print(count)
tag
相关文章推荐
- 找零问题_动态规划
- 硬币找零问题(动态规划)
- 硬币找零问题_动态规划_算法与数据结构
- 硬币找零问题(动态规划求解)
- 人民币找零 vs 硬币问题 贪心 vs 动态规划
- 最少硬币找零问题-动态规划
- 动态规划之最少硬币找零问题
- 动态规划求解硬币找零问题——Java实现
- 动态规划 找零问题
- 动态规划入门之硬币找零问题
- 最少硬币找零问题-动态规划
- IT笔试--动态规划--货币找零问题
- [动态规划]背包问题(找零/子集和/编辑距离)
- 硬币找零问题 - 动态规划
- 【动态规划】之硬币找零问题(难度:1星)
- 动态规划求解最多有几种方案求解硬币找零问题
- “人民币找零”问题的贪婪法解决算法
- 石子合并问题 --动态规划--解法1
- “人民币找零”问题的贪婪法解决算法
- 动态规划解决矩阵链乘问题的java编码实现