mirror of
				https://github.com/krahets/hello-algo.git
				synced 2025-11-04 14:18:20 +08:00 
			
		
		
		
	* Sync recent changes to the revised Word. * Revised the preface chapter * Revised the introduction chapter * Revised the computation complexity chapter * Revised the chapter data structure * Revised the chapter array and linked list * Revised the chapter stack and queue * Revised the chapter hashing * Revised the chapter tree * Revised the chapter heap * Revised the chapter graph * Revised the chapter searching * Reivised the sorting chapter * Revised the divide and conquer chapter * Revised the chapter backtacking * Revised the DP chapter * Revised the greedy chapter * Revised the appendix chapter * Revised the preface chapter doubly * Revised the figures
		
			
				
	
	
		
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
// File: coin_change.go
 | 
						|
// Created Time: 2023-07-23
 | 
						|
// Author: Reanon (793584285@qq.com)
 | 
						|
 | 
						|
package chapter_dynamic_programming
 | 
						|
 | 
						|
import "math"
 | 
						|
 | 
						|
/* 零钱兑换:动态规划 */
 | 
						|
func coinChangeDP(coins []int, amt int) int {
 | 
						|
	n := len(coins)
 | 
						|
	max := amt + 1
 | 
						|
	// 初始化 dp 表
 | 
						|
	dp := make([][]int, n+1)
 | 
						|
	for i := 0; i <= n; i++ {
 | 
						|
		dp[i] = make([]int, amt+1)
 | 
						|
	}
 | 
						|
	// 状态转移:首行首列
 | 
						|
	for a := 1; a <= amt; a++ {
 | 
						|
		dp[0][a] = max
 | 
						|
	}
 | 
						|
	// 状态转移:其余行和列
 | 
						|
	for i := 1; i <= n; i++ {
 | 
						|
		for a := 1; a <= amt; a++ {
 | 
						|
			if coins[i-1] > a {
 | 
						|
				// 若超过目标金额,则不选硬币 i
 | 
						|
				dp[i][a] = dp[i-1][a]
 | 
						|
			} else {
 | 
						|
				// 不选和选硬币 i 这两种方案的较小值
 | 
						|
				dp[i][a] = int(math.Min(float64(dp[i-1][a]), float64(dp[i][a-coins[i-1]]+1)))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if dp[n][amt] != max {
 | 
						|
		return dp[n][amt]
 | 
						|
	}
 | 
						|
	return -1
 | 
						|
}
 | 
						|
 | 
						|
/* 零钱兑换:动态规划 */
 | 
						|
func coinChangeDPComp(coins []int, amt int) int {
 | 
						|
	n := len(coins)
 | 
						|
	max := amt + 1
 | 
						|
	// 初始化 dp 表
 | 
						|
	dp := make([]int, amt+1)
 | 
						|
	for i := 1; i <= amt; i++ {
 | 
						|
		dp[i] = max
 | 
						|
	}
 | 
						|
	// 状态转移
 | 
						|
	for i := 1; i <= n; i++ {
 | 
						|
		// 倒序遍历
 | 
						|
		for a := 1; a <= amt; a++ {
 | 
						|
			if coins[i-1] > a {
 | 
						|
				// 若超过目标金额,则不选硬币 i
 | 
						|
				dp[a] = dp[a]
 | 
						|
			} else {
 | 
						|
				// 不选和选硬币 i 这两种方案的较小值
 | 
						|
				dp[a] = int(math.Min(float64(dp[a]), float64(dp[a-coins[i-1]]+1)))
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if dp[amt] != max {
 | 
						|
		return dp[amt]
 | 
						|
	}
 | 
						|
	return -1
 | 
						|
}
 |