文章目录
- ● 70. 爬楼梯 (进阶)
- 思路:- 排列 先value后weight
- 代码:
- ● 322. 零钱兑换
- 思路:
- 代码
- ● 279.完全平方数
- 思路:
- 代码
● 70. 爬楼梯 (进阶)
思路:- 排列 先value后weight
代码:
import java.util.*;
public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int n=sc.nextInt();int m=sc.nextInt();int[] dp=new int[n+1];dp[0]=1;for(int j=1;j<=n;j++){for(int i=0;i<=m;i++){if(j>=i)dp[j]+=dp[j-i];}}System.out.println(dp[n]);}
}
● 322. 零钱兑换
思路:
代码
class Solution {public int coinChange(int[] coins, int amount) {// int n=coins.length;int[] dp=new int[amount+1];dp[0]=0;for(int i=1;i<=amount;i++){dp[i]=Integer.MAX_VALUE/2;// 除 2 是防止下面 + 1 溢出}for(int i=0;i<coins.length;i++){for(int j=coins[i];j<=amount;j++){dp[j]=Math.min(dp[j],dp[j-coins[i]]+1);}}return dp[amount]==Integer.MAX_VALUE/2?-1:dp[amount];}
}
或者
class Solution {public int coinChange(int[] coins, int amount) {int max = Integer.MAX_VALUE;int[] dp = new int[amount + 1];//初始化dp数组为最大值for (int j = 0; j < dp.length; j++) {dp[j] = max;}//当金额为0时需要的硬币数目为0dp[0] = 0;for (int i = 0; i < coins.length; i++) {//正序遍历:完全背包每个硬币可以选择多次for (int j = coins[i]; j <= amount; j++) {//只有dp[j-coins[i]]不是初始最大值时,该位才有选择的必要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 max = Integer.MAX_VALUE;int[] dp = new int[n + 1];//初始化for (int j = 0; j <= n; j++) {dp[j] = max;}//如果不想要寫for-loop填充數組的話,也可以用JAVA內建的Arrays.fill()函數。//Arrays.fill(dp, Integer.MAX_VALUE);//当和为0时,组合的个数为0dp[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);//}//不需要這個if statement,因爲在完全平方數這一題不會有"湊不成"的狀況發生( 一定可以用"1"來組成任何一個n),故comment掉這個if statement。}}return dp[n];}
}