淘客导购网站怎么做,军事网址大全 网站,公司网站建设 上海,花卉网站建设项目策划书爬楼梯#xff08;进阶#xff09;
题目#xff1a;假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢#xff1f;
思路#xff1a;本题也可以抽象成完全背包的问题#xff0c;背包就是总共多少阶台阶进阶
题目假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢
思路本题也可以抽象成完全背包的问题背包就是总共多少阶台阶物品就是每次可以爬多少楼梯可以爬1阶也可以爬2阶和顺序有关系所有是完全背包
dp[i]的含义爬i阶楼梯总共有dp[i]种方法递推公式dp[i] dp[i-j]dp初始化dp[0] 1遍历顺序先遍历背包后遍历物品打印dp数组
class Solution {public int climbStairs(int n) {// dp[i]表示爬i阶台阶有dp[i]中方式int[] dp new int[n1];// 初始化dp[0] 1;int[] weigth {1,2};for(int i 0;in;i){// 背包for(int j 0;jweigth.length;j){// 物品if(i weigth[j]){dp[i] dp[i-weigth[j]];}}}return dp[n];}
}零钱兑换
题目给你一个整数数组 coins 表示不同面额的硬币以及一个整数 amount 表示总金额。
计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额返回 -1 。
你可以认为每种硬币的数量是无限的。
dp[j]的含义凑成金额为j最少需要dp[j]个硬币递推公式dp[j] Math.min(dp[j],dp[j-coins[i]]1) dp[j]不放当前硬币因为是一维数组所有这里用的是上一次遍历的结果dp[j-coins[i]]1放当前硬币放了当前硬币剩余的金额的最少硬币数1当前这个硬币就是放当前硬币的最少硬币数 dp数组初始化dp[j] Integer_MAX_VALUEdp[0] 0因为取的是最小值所有就不能全部初始化成0了因为dp[0] 0所有就会一种都是0遍历顺序先遍历物品后遍历背包打印dp数组
class Solution {public int coinChange(int[] coins, int amount) {// dp[i]表示凑成金额为i最少需要dp[i]个硬币int[] dp new int[amount1];Arrays.fill(dp,Integer.MAX_VALUE);dp[0] 0;for(int i 0;icoins.length;i){// 物品for(int j coins[i];jamount;j){// 背包if(dp[j-coins[i]] ! Integer.MAX_VALUE){// 如果遇到初始值则跳过dp[j] Math.min(dp[j],dp[j-coins[i]]1);}}}return dp[amount] Integer.MAX_VALUE ? -1 :dp[amount];}
}完全平方数
题目给你一个整数 n 返回 和为 n 的完全平方数的最少数量 。
完全平方数 是一个整数其值等于另一个整数的平方换句话说其值等于一个整数自乘的积。例如1、4、9 和 16 都是完全平方数而 3 和 11 不是。
思路本题的物品就是14916…等等完全平方数背包就是n
dp[i]的含义dp[i]个完全平方数和为i递推公式dp[i] Math.min(dp[i],dp[i-i*i]1)dp数组初始化dp[i]Integer.MAX_VALUEdp[0]0遍历顺序先物品后背包打印dp数组
class Solution {public int numSquares(int n) {// dp[i]表示整数idp[i]个完全平方数和为iint[] dp new int[n1];Arrays.fill(dp,Integer.MAX_VALUE);dp[0] 0;for(int i 1;i*in;i){// 物品for(int j i*i;jn;j){// 背包if(dp[j-i*i] ! Integer.MAX_VALUE){dp[j] Math.min(dp[j],dp[j-i*i]1);}}}return dp[n] Integer.MAX_VALUE ? -1 : dp[n];}
}