动态规划入门基础 最优子结构
三种方法不断优化
class Solution {
int[] memo;
public int coinChange(int[] coins, int amount) {
//备忘录
// memo = new int[amount+1];
// Arrays.fill(memo,-666);
//3、dp数组迭代
//dp数组
int[] dp = new int[amount+1];
Arrays.fill(dp,amount+1);
dp[0] = 0;
for(int i = 0;i < dp.length;i++){
for(int coin:coins){
if(i-coin<0){
continue;
}
dp[i] = Math.min(dp[i],1+dp[i-coin]);
}
}
return(dp[amount] == amount+1)?-1:dp[amount];
}
//1、暴力
public int dp(int[] coins,int amount){
//base case
if(amount<0){
return -1;
}
if(amount==0){
return 0;
}
int res = Integer.MAX_VALUE;
for(int coin : coins){
int subProbleem = dp(coins,amount-coin);
if(subProbleem == -1){
continue;
}
res = Math.min(res,subProbleem+1);
}
return res == Integer.MAX_VALUE?-1:res;
}
//2、备忘录
public int dp(int[] coins,int amount){
if(amount<0){
return -1;
}
if(amount==0){
return 0;
}
if(memo[amount]!=-666){
return memo[amount];
}
int res = Integer.MAX_VALUE;
for(int coin:coins){
int subProblem = dp(coins,amount-coin);
if(subProblem==-1){
continue;
}
res = Math.min(res,subProblem+1);
}
memo[amount] = (res == Integer.MAX_VALUE)?-1:res;
return memo[amount];
}
}