完全背包问题

/*
经典动态规划:完全背包问题
给定不同面额的硬币和一个总金额,写出函数来计算可以促成总金额的硬币的
组合数,假设每种面额的硬币有无限个
列一:
输入:amount = 5 , coins = [1,2,5]
输出:4
5= 5
5= 2+2+1
5= 2+1+1+1
5= 1+1+1+1+1
解题思路  完全背包问题
第一步 明确状态和选择
状态有两种 背包的容量 和可选择的物品
选择 是 装进包 或者不装进背包
第二步
明确动态规范dp的数组定义
状态有两个 背包的容量 可选物品  一个二维数组
dp[i][j] i个物品 容纳为j
如果选择i  当背包为j的时候 有dp[i][j] 种方法
第三步 根据 选择 思考状态的转移的逻辑
如果不把第i个物品装入背包 你就不使用coins[i]的硬币 那么促出
面额为j的的方法d[i][j]应该等于d[i-1][j]的方法
如果把第i个物品装入背包 那就使用coins[i]的硬币dp[i][j-coins[i-1]]
首先由于 i 是从 1 开始的,所以 coins 的索引是 i-1 时表示第 i 个硬币的面值
 */
func  Change( amount int, coins []int ) int  {
	n:= len(coins)
	var dp  = make([][]int,n+1,amount+1)
	for i:=0;i<=n;i++{
		column:= make([]int,amount+1)
		dp[i] = column
		dp[i][0] = 1
	}
	for i:=1;i<=n;i++{
		for j:=1;j<=amount;j++{
			if j < coins[i-1] {
				dp[i][j] = dp[i-1][j]
			}else{
				dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]]
			}
		}
	}
	return  dp[n][amount]

}
func main() {
	coins:= []int{1,2,5}
	amount:=5
	Change(amount,coins)
}

你可能感兴趣的:(动态规划)