java dp处理_Java-对DP解决方案的硬币更改理解

我做运动:

“You are given coins of different denominations and a total amount of money amount. Write a function to compute the fewest number of coins that you need to make up that amount. If that amount of money cannot be made up by any combination of the coins, return -1.”

Example 1:

coins = [1, 2, 5], amount = 11

return 3 (11 = 5 + 5 + 1)

我还用谷歌搜索这样的解决方案:

public class Solution {

public int coinChange(int[] coins, int amount) {

int dp[] = new int[amount + 1];

final int INF = 0x7ffffffe;

for (int i = 1; i <= amount; i++) dp[i] = INF;

for (int i = 0; i <= amount; i++) {

for (int j = 0; j < coins.length; j++) {

if (i + coins[j] <= amount)

dp[i + coins[j]] = Math.min(dp[i + coins[j]], dp[i] + 1);

}

}

return dp[amount] == INF ? -1 : dp[amount];

}

}

我知道关于DP的知识,但是,我对此感到非常困惑,例如dp [i coin [j]]的含义是什么,为什么加i,为什么dp [i] 1,为什么加1?

谁能用简单的英语显示出路?

解决方法:

好的,让我们首先看看该代码在做什么和正在使用什么. DP用于存储一定值所需的硬币数量.这样做的目的是为了获得值所需的硬币数量只是“ dp的值项”.但是,我们如何得到该金额的有序列表?

他使用内部for循环遍历他拥有的所有硬币,试图将硬币的值添加到当前值(i).如果该值小于目标数量,则将为其分配一个值.

dp[i + coins[j]] = (...)

我们知道列表是按值排序的,我们将通过获取当前条目(i)的值加上当前硬币(coins [j])的值来获得需要更改的条目的值.那是它的左边.

现在到了正确的部分:您正在寻找可能的最小数量,因此您正在使用Math.Min来获取n个参数中的较小者,在这种情况下为两个.第一个参数是我们将要覆盖的值.如果我们已经找到了一种表示值的好方法,为什么要覆盖它呢?我们可能会不小心杀死它,因此我们确保只有在找到不比所获得的更好的解决方案时才这样做.第二个参数只是我们要达到当前值1所需的硬币数量.

(...) = Math.min(dp[i + coins[j]], dp[i] + 1);

如果您还不太了解,请随时询问更多详细信息:)

标签:java

来源: https://codeday.me/bug/20191027/1944755.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值