代码随想录第四十五天 | 动态规划
今天是第四十五天,继续动态规划
class Solution { public int climbStairs(int n) { int[] dp = new int[n+1]; dp[0] = 1; for(int i = 0; i<=n; i++){ for(int j = 1; j<= 2; j++){ int temp = i - j; if(temp < 0){ continue; } dp[i] += dp[temp]; } } return dp[n]; } }
可以转化成完全背包问题,外圈loop是背包,里面的物品
class Solution { public int coinChange(int[] coins, int amount) { int max = Integer.MAX_VALUE; int[] dp = new int[amount + 1]; for (int j = 0; j < dp.length; j++) { dp[j] = max; } dp[0] = 0; for (int i = 0; i < coins.length; i++) { for (int j = coins[i]; j <= amount; j++) { if (dp[j - coins[i]] != max) { dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1); } } } return dp[amount] == max ? -1 : dp[amount]; } }
也是一道完全背包问题,但此题不受硬币顺序影响,因此内外两层for loop无论先后背包物品都是可以的
class Solution { public int numSquares(int n) { int max = Integer.MAX_VALUE; int[] dp = new int[n + 1]; for (int j = 0; j <= n; j++) { dp[j] = max; } dp[0] = 0; for (int i = 1; i * i <= n; i++) { for (int j = i * i; j <= n; j++) { if (dp[j - i * i] != max) { dp[j] = Math.min(dp[j], dp[j - i * i] + 1); } } } return dp[n]; } }
先物品再背包
今天是完全背包,明天继续!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?