动态规划之找零钱问题

原创 2015年07月09日 14:25:04
import java.util.ArrayList;

public class Coin {
	/**
	 * 凑够sum至少需要多少coin
	 * @param coins coin面值
	 * @param sum
	 * @return
	 */
	public static int[] getLeastNum(int[] coins, int sum) {
		int[] d = new int[sum + 1];
		d[0] = 0;
		
		for (int i = 1; i <= sum; i++) {
			int min = i - coins[0] >= 0 ? d[i - coins[0]] + 1 : 0;
			for (int j = 1; j < coins.length; j++) {
				if ((i - coins[j]) >= 0 && min > d[i - coins[j]] + 1) {
					min = d[i - coins[j]] + 1;
				}
			}
			d[i] = min;
		}
		return d;
	}
	
	public static ArrayList<Integer>[] getLeastNumAndValue(int[] coins, int sum) {
		ArrayList[] ret = new ArrayList[sum + 1];
		
		for (int i = 0; i < ret.length; i++) {
			ret[i] = new ArrayList<Integer>();
		}
		ret[0].add(0);
		
		int[] d = new int[sum + 1];
		d[0] = 0;
		
		for (int i = 1; i <= sum; i++) 
		{
			int min = i - coins[0] >= 0 ? d[i - coins[0]] + 1 : 0;
			boolean flag = true;
			int j = 1;
			int min_ = 1;
			for (; j < coins.length; j++) 
			{
				if ((i - coins[j]) >= 0 && min >= d[i - coins[j]] + 1) 
				{
					min = d[i - coins[j]] + 1;
					min_ = j;
					flag = false;
				}
			}
			d[i] = min;
			if (flag) {
				ret[i].add(coins[0]);
				if (i - coins[0] > 0)
					ret[i].addAll(ret[i - coins[0]]);
			} else {
				ret[i].add(coins[min_]);
				if (i - coins[min_] > 0)
					ret[i].addAll(ret[i - coins[min_]]);
			}
		}
		return ret;
	}
	
	public static void main(String[] args) {
		int coins[] = {1, 3, 5};
		int[] ret = getLeastNum(coins, 21);
		ArrayList<Integer>[] nums = getLeastNumAndValue(coins, 21);
		for (int i = 1; i < ret.length; i++) {
			System.out.print("i = " + i + "  value = " + ret[i] + "  nums = ");
			ArrayList<Integer> r = nums[i];
			for (int j = 0; j < r.size(); j++) {
				System.out.print(r.get(j) + " ");
			}
			System.out.println();
		}
		
	}

}

参考网址:http://www.360doc.com/content/13/0601/00/8076359_289597587.shtml

                   http://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html

找零钱-动态规划

问题:
  • jiyanfeng1
  • jiyanfeng1
  • 2014年10月28日 22:27
  • 4282

动态规划5:找零钱问题

题目: 有数组penny,penny中所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim(小于等于1000)代表要找的钱数,求换钱有多少种方法...
  • u012813201
  • u012813201
  • 2017年07月18日 10:35
  • 293

动态规划 找零钱问题

这个用贪心的话 会出错 记录一下这个例子 比如金额是10块,面币为2 5 6 11 10 按照贪心的话 肯定选6和2张2,但是只要2张5块就可以了,因此贪心法会出现问题,所以,需要用动态规划,写出状态...
  • qq_31214097
  • qq_31214097
  • 2016年05月13日 23:15
  • 1724

动态规划算法思想解决找零钱问题

前言     关于找零钱问题,网上已经有很多相关的资料以及优秀的文章博客等。这里写这篇博客的初衷很简单,就是为了方便自己,回过头来捡起这个知识能快一点,接受起来更易理解点;他人的文章写的再好,毕竟是别...
  • niaonao
  • niaonao
  • 2017年10月16日 14:20
  • 608

最少硬币找零问题-动态规划

动态规划把问题分为子为题
  • KangRoger
  • KangRoger
  • 2014年06月30日 21:15
  • 21622

JAVA动态规划(一)--最少硬币找零问题

问题:要找K云的零钱,零钱的种类已知,保存在数组coins[]中,要求:求出构成N所需的最少硬币的数量和零钱的具体数值。 分析:(1)贪心算法:,先从面额最大的硬币开始尝试,一直往下找,知道硬币总和...
  • y999666
  • y999666
  • 2016年03月31日 22:24
  • 3678

动态规划算法-----找零钱问题(求最优解)

动态规划算法通常用于求解具有某种最优性质的问题。动态规划算法与分治法类似,其基本思想都是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态...
  • MrJavaweb
  • MrJavaweb
  • 2017年08月03日 10:58
  • 441

动态规划解决找零钱问题

贪心算法在求解找零钱的某些情况时,无法得到全局最优方案;使用动态规划,则可以保证每次都取得最优方案。...
  • littleschemer
  • littleschemer
  • 2015年09月09日 19:03
  • 7039

最少硬币找零问题-动态规划

动态规划把问题分为子为题,解决了这些子问题,再把子问题合并起来,便可以得到问题的解。在解决子问题过程中,需要把子问题的解保存起来方便后面使用。 最少硬币找零问题为:给予不同面值的硬币若干种种(每...
  • M771310443
  • M771310443
  • 2015年12月05日 19:05
  • 1761

动态规划算法问题(经典找零案例)

问题: 给定数组arr,arr中的所有的值都为正数且不重复。每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法。 暴力搜索方法 思路分析...
  • huzhanfei
  • huzhanfei
  • 2017年03月20日 01:51
  • 901
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:动态规划之找零钱问题
举报原因:
原因补充:

(最多只允许输入30个字)