From af4056827594bdc1db564a91cc86d196e5a48a6d Mon Sep 17 00:00:00 2001 From: EmmIons <48384706+EmmIons@users.noreply.github.com> Date: Sat, 20 Jan 2024 18:02:03 +0800 Subject: [PATCH] =?UTF-8?q?Update=200518.=E9=9B=B6=E9=92=B1=E5=85=91?= =?UTF-8?q?=E6=8D=A2II.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit java版本二维dp数组代码逻辑优化, 原版本的二维dp数组和一维dp数组的逻辑并不对应. --- problems/0518.零钱兑换II.md | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/problems/0518.零钱兑换II.md b/problems/0518.零钱兑换II.md index 5c6efdcb..fa104541 100644 --- a/problems/0518.零钱兑换II.md +++ b/problems/0518.零钱兑换II.md @@ -224,20 +224,26 @@ class Solution { // 二维dp数组版本,方便理解 class Solution { public int change(int amount, int[] coins) { - int[][] dp = new int[coins.length][amount + 1]; - // 只有一种硬币的情况 - for (int i = 0; i <= amount; i += coins[0]) { - dp[0][i] = 1; + int[][] dp = new int[coins.length][amount+1]; + + // 初始化边界值 + for(int i = 0; i < coins.length; i++){ + // 第一列的初始值为1 + dp[i][0] = 1; } - for (int i = 1; i < coins.length; i++) { - for (int j = 0; j <= amount; j++) { - // 第i种硬币使用0~k次,求和 - for (int k = 0; k * coins[i] <= j; k++) { - dp[i][j] += dp[i - 1][j - k * coins[i]]; - } + for(int j = coins[0]; j <= amount; j++){ + // 初始化第一行 + dp[0][j] += dp[0][j-coins[0]]; + } + + for(int i = 1; i < coins.length; i++){ + for(int j = 1; j <= amount; j++){ + if(j < coins[i]) dp[i][j] = dp[i-1][j]; + else dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j]; } } - return dp[coins.length - 1][amount]; + + return dp[coins.length-1][amount]; } } ```