您的位置:首页 > 其它

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]

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: