● 70. 爬楼梯 (进阶)
class Solution { public int climbStairs(int n) { int[] dp = new int[n+1];//设置背包容量:n个 int m =2;//有两个物品,注意这是一个完全背包问题 dp[0] = 1;//initialize for(int i = 1;i<=n;i++){//遍历背包 for(int j = 1;j<=m;j++){//遍历物品 if(i >= j) dp[i] += dp[i-j]; //走了 j 步,就还剩下i-j //而dp[i]是指到达i层的总方法数 } } return dp[n]; } }
● 322. 零钱兑换
class Solution { public int coinChange(int[] coins, int amount) { // 注意题目中说的是最少硬币书,与排列和组合都没有关系,所以for循环顺序随便,因为我们始终要遍历物品和背包 int max = Integer.MAX_VALUE; int[] dp = new int[amount+1]; dp[0] = 0; for(int i =1;i<=amount;i++){ dp[i] = max; } for(int i = 0;i<coins.length;i++){ for(int j = coins[i];j<=amount;j++){//还是对每个硬币进行遍历,只是根据硬币来看的 //肯定是j-coins[i],不是j本身哈,这样保证了从0开始 if(dp[j - coins[i]]!=max){ dp[j] = Math.min(dp[j],dp[j-coins[i]]+1); } } } return dp[amount]==max?-1:dp[amount]; } }
● 279.完全平方数
class Solution { public int numSquares(int n) { int[] dp = new int[n+1];//背包容量 int max = Integer.MAX_VALUE; for(int i =1;i<=n;i++){ dp[i] = max; } 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]; } }