322 零錢兌換

2021-10-18 05:00:57 字數 1624 閱讀 1291

class

solution

// //不是大的取的越多越好,大的取的很多,最後不能剛好取到,比如22,陣列是10,6,你直接取兩個10肯定不行第乙個數有取1個,取0個或者取多個好幾種取法。比如18,你有10和6,那麼10乙個都不能取

// //所以要考慮的只是當前這一位可以取幾個

// for(int i = left/coins[index]; i >= 0; --i)

// }

intcoinchange

(vector<

int>

& coins,

int amount)

// for(int i = 1; i <= coins.size(); ++i)

// }

// }

// return (dp[coins.size()][amount] == inf ? -1:dp[coins.size()][amount]);

//狀壓dp

vector<

int>

dp(amount+

1,inf)

; dp[0]

=0;for

(int i =

0; i < coins.

size()

;++i)}}

return dp[amount]

== inf?-1

:dp[amount];}

// private:

// int res = int_max;

};

完全揹包,可以無限取的就是完全揹包,內部從1開始遍歷,因為這一層需要這一層前面的情況,所以先更新前面的。如果是01揹包,就要先更新後面的,因為01揹包只用到上一層的情況

class

solution

}return dp[amount]

== inf ?-1

:dp[amount];}

};

左邊的結果要更新過的,因為我們是無限取的,所以要考慮取過第i枚硬幣的情況。

dp[i][j]代表前i個元素可以組成總金額j的最少硬幣數,重點是可以重複取

class

solution

// for(int i = 1; i <= coins.size(); ++i)

// else

// }

// }

// return dp[coins.size()][amount] == 1e9 ? -1 : dp[coins.size()][amount];

//狀壓dp,只和左和上有關,但是左是要更新過的左,所以內部迴圈還是從小到大

vector<

int>

dp(amount+1,

1e9)

; dp[0]

=0;for

(int i =

1; i <= coins.

size()

;++i)

}return dp[amount]

==1e9?-

1: dp[amount];}

};

322 零錢兌換

最值問題 最優子結構特性 子問題重疊特性 使用動態規劃 狀態轉移方程 列出狀態轉移方程 步驟 1.明確狀態 原問題和子問題中變化的量 amount 連續性變化 2.定義動態規劃陣列 函式的含義 dp n 的含義 湊成n需要的硬幣個數 3.明確選擇 對於每個狀態,可以做出什麼選擇來改變當前狀態 選乙個...

322 零錢兌換

給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。示例 1 輸入 coins 1,2,5 amount 11 輸出 3 解釋 11 5 5 1 示例 2 輸入 coins 2 amount...

322 零錢兌換

leetcode 322 零錢兌換 給定不同面額的硬幣 coins 和乙個總金額 amount。編寫乙個函式來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 1。leetcode 322 零錢兌換 官方題解 搜尋回溯 超出時間限制 動態規劃 自頂向下 動態規劃 自...