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.完全平方数
思路
和上题一致,注意自己转换物品
for i:=1;ii<=n;i++{
nums=append(nums,ii)
}
思路代码
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)
}