动态规划part7 | ● 322. 零钱兑换 ● 279.完全平方数

文章介绍了使用动态规划解决322题零钱兑换和279题完全平方数的问题,通过初始化dp数组为最大值来确保能正确判断,同时展示了如何更新dp状态以找到最少数量的解决方案。难点在于dp数组的初始化和状态转移方程的运用。
摘要由CSDN通过智能技术生成


322.零钱兑换

322.零钱兑换

思路

dp[j]=min(dp[j],dp[j-coins[i]]+1)

思路代码

func coinChange(coins []int, amount int) int {
    dp:=make([]int,amount+1)
    for i:=1;i<amount+1;i++{
        dp[i]=math.MaxInt64
    }
    for i:=0;i<len(coins);i++{
        for j:=0;j<=amount;j++{
            if j>=coins[i]&&dp[j-coins[i]]!=math.MaxInt64{
                dp[j]=min(dp[j],dp[j-coins[i]]+1)
            }
        }
    }
    if dp[amount]==math.MaxInt64{
        return -1
    }
    return dp[amount]
}

func min(i,j int)int{
    if i<j{
        return i
    }
    return j
}

困难

dp初始化的时候要置为最大值,这样才能判断是否能装入。


279.完全平方数

279.完全平方数

思路

和上题一致,注意自己转换物品
for i:=1;ii<=n;i++{
nums=append(nums,i
i)
}

思路代码

func numSquares(n int) int {
    dp:=make([]int,n+1)
    nums:=[]int{}
    for i:=1;i<=n;i++{
        dp[i]=math.MaxInt64
    } 
    for i:=1;i*i<=n;i++{
        nums=append(nums,i*i)
    }
    for i:=0;i<len(nums);i++{
        for j:=nums[i];j<=n;j++{ //如果是非排列问题,直接优化成从nums[i]开始就行了,如果是排列问题,才需要外层遍历背包,循环的时候才需要控制if j>=nums[i]
            dp[j]=min(dp[j],dp[j-nums[i]]+1)
        }
    }
    return dp[n]
}

func min(i,j int)int{
    if i<j{
        return i
    }
    return j
}

困难

自己转换物品

for i:=1;i*i<=n;i++{
        nums=append(nums,i*i)
    }

今日收获

完全背包最少个数问题

dp:=make([]int,amount+1)
    for i:=1;i<amount+1;i++{
        dp[i]=math.MaxInt64
    }

if j>=coins[i]&&dp[j-coins[i]]!=math.MaxInt64{
                dp[j]=min(dp[j],dp[j-coins[i]]+1)
            }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值