package main
import (
"math"
)
/*
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬至多m (1 <= m < n)个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
输入描述:输入共一行,包含两个正整数,分别表示n, m
输出描述:输出一个整数,表示爬到楼顶的方法数。
输入示例:3 2
输出示例:3
提示:
当 m = 2,n = 3 时,n = 3 这表示一共有三个台阶,m = 2 代表你每次可以爬一个台阶或者两个台阶。
此时你有三种方法可以爬到楼顶。
1 阶 + 1 阶 + 1 阶段
1 阶 + 2 阶
2 阶 + 1 阶
*/
func climbStairs2(n, m int) int {
dp := make([]int, n+1)
dp[0] = 1
for i := 1; i <= n; i++ { // 遍历物品
for j := 1; j <= m; j++ { // 遍历背包
if i-j >= 0 {
dp[i] += dp[i-j]
}
}
}
return dp[n]
}
func min(a, b int) int {
if a < b {
return a
}
return b
}
func coinChange(coins []int, amount int) int {
dp := make([]int, amount+1)
dp[0] = 0
for i := 1; i <= amount; i++ { //初始化最大值
dp[i] = math.MaxInt32
}
for i := 0; i < len(coins); i++ { // 遍历物品
for j := coins[i]; j <= amount; j++ { // 遍历背包
if dp[j-coins[i]] != math.MaxInt32 {
dp[j] = min(dp[j-coins[i]]+1, dp[j])
}
}
}
if dp[amount] == math.MaxInt32 {
return -1
}
return dp[amount]
}
func numSquares(n int) int {
dp := make([]int, n+1)
dp[0] = 0
for i := 1; i <= n; i++ { //初始化最大值
dp[i] = math.MaxInt32
}
for i := 1; i*i <= n; i++ { // 遍历物品
for j := i * i; j <= n; j++ { // 遍历背包
if j >= i*i {
dp[j] = min(dp[j-i*i]+1, dp[j])
}
}
}
return dp[n]
}
/*
func main() {
res := numSquares(12)
fmt.Println(res)
}*/