中級算法之動態規劃:零錢兌換

給定不同面額的硬幣 coins 和一個總金額 amount。編寫一個函數來計算可以湊成總金額所需的最少的硬幣個數。如果沒有任何一種硬幣組合能組成總金額,返回 -1。

示例 1:

輸入: coins = [1, 2, 5], amount = 11
輸出: 3 
解釋: 11 = 5 + 5 + 1
示例 2:

輸入: coins = [2], amount = 3
輸出: -1

說明:
你可以認爲每種硬幣的數量是無限的。

設置dp[i]爲金額爲i時的最小硬幣數,初始化全爲-1,dp[0] = 0,狀態轉移方程爲:
對於每個i,遍歷所有的硬幣(面值爲t),設置一個minCnt,選擇出最小的dp[i-t]+1作爲dp[i]的值。

int coinChange(vector<int>& coins, int amount) {
	vector<int> dp(amount + 1, -1);
	dp[0] = 0;
	for (int i = 0; i <= amount; i++) {
		if (i == 0) continue;
		double minCnt = INT_MAX;
		for (int j = 0; j < coins.size(); j++) {
			if (i - coins[j] >= 0 && dp[i - coins[j]] != -1 && minCnt > dp[i - coins[j]]) {
				minCnt = dp[i - coins[j]] + 1;
			}
		}
		if (minCnt != INT_MAX) dp[i] = minCnt;
		// cout << i<<" " << dp[i] << endl;

	}
	return dp[amount] == INT_MAX ? -1 : dp[amount];
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章