代码如下
func coinChange(coins []int, amount int) int {
dp := make([]int,amount+1) //dp[j]数组的含义是装满容量为j的背包最少需要几件物品
dp[0] = 0
for j := 1 ; j <= amount ; j++ { //因为是取最小物品,所以为了避免递推关系式时,被默认值0取代,所以将所有的初始值设置为最大值
dp[j] = math.MaxInt
}
for i := 0 ; i < len(coins) ; i++ {
for j := coins[i] ; j <= amount ; j++ {
if dp[j-coins[i]] != math.MaxInt { //因为是比较放与不放物品的最小值,所以如果这个值是int最大值就没有放入的必要
dp[j] = min(dp[j],dp[j-coins[i]]+1)
}
}
}
if dp[amount] == math.MaxInt { 如果这个数值还是初始值没有被改变,说明没有能够满足这个背包容量的元素组合
return -1
}else {
return dp[amount]
}
}
func min(a,b int) int {
if a < b {
return a
}else {
return b
}
}
279 完全平方数
代码如下
func numSquares(n int) int {
dp := make([]int,n+1)
dp[0] = 0
for j := 1 ; j <= n ; j++ {
dp[j] = math.MaxInt
}
for i := 1 ; i*i <= n ; i++ {
for j := i*i ; j <= n ; j++ {
if dp[j-i*i] != math.MaxInt {
dp[j] = min(dp[j],dp[j-i*i]+1)
}
}
}
if dp[n] == math.MaxInt {
return -1
}else {
return dp[n]
}
}
func min(a,b int) int {
if a < b {
return a
}else {
return b
}
}
139 单词拆分
代码如下
func wordBreak(s string, wordDict []string) bool {
worddictset := make(map[string]bool) //设置一个map,用于存放字典里的单词,单词设为key值,value为真。表示这些单词存在
for _,v := range wordDict {
worddictset[v] = true //遍历单词集,将每个单词设置为存在 即value为真
}
dp := make([]bool,len(s)+1) //设置dp数组,dp数组含义为当前个字母下,存在于字典中
dp[0] = true
for i := 1 ; i <= len(s) ; i++ { 遍历背包
for j := 0 ; j < i ; j++ { 遍历物品,物品是从0开始到背包容量,假如背包容量为i则最后一个物品即字母下标为i-1
if dp[j] && worddictset[s[j:i]] { 如果dp[j]为真,且j-i这一段组成的字符也存在于字典里,那么整个dp[i]就为真,立刻退出循环,没必要继续将j后移进行判断
dp[i] = true
break
}
}
}
return dp[len(s)]
}