动态规划求付出的最少硬币数

问题是这样的:假设我有多种面值的硬币,都不限量,此时给定我一个整数金额,怎么组合出最少硬币数?
public class DPCoin {
	public static void getMinestCoinsNum(int[] coins, int coinsLength, int money) {
		if(coins == null || coinsLength < 0 || money < 0)
			return ;
		
		int[] minCoins = new int[money+1];
		
		minCoins[0] = 0;
		
		for(int i = 1; i <= money; i++) { //从小到大遍历1元、2元...,i元,求取i元下需要的最少硬币个数
			int min = i; //最小需要多少硬币,这里初始设置为最多的硬币个数,即都是1块钱硬币
			
			for(int j = 0; j < coinsLength; j++) { //当前手上有一个coins[j]面值的硬币,那么求取i-coins[j]这个子问题所需要的最少硬币数
				//求当前i下的所有子问题的最优解,比较得到i下的最优解
				if(coins[j] <= i) { //如果手上硬币面值过大,兑换不了
					int temp = minCoins[i-coins[j]] + 1; //temp就是i-coins[j]这个子问题所需要的最少硬币数 + 手上的coins[j]面值的硬币
					if(min > temp)
						min = temp;
				}else break;
			}
			minCoins[i] = min; //当前如果收到i元,那么最少兑换的硬币个数就是min
			if(i == money)
				System.out.println(money + "元最少找钱硬币数为" + minCoins[i] + "个");
		}
	}
	
	public static void main(String[] args) {
		int[] coins = {1, 2, 5, 10, 12}; //硬币面值从小到大排序,否则子问题无法完全求解
		int money = 101;
		getMinestCoinsNum(coins, coins.length, money);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值