class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount +1];
int max = Integer.MAX_VALUE;
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 - coins[i]] + 1, dp[j]);
}
}
}
return dp[amount] == max ? -1 : dp[amount];
}
}
class Solution {
public int numSquares(int n) {
int[] dp = new int[n +1];
int max = Integer.MAX_VALUE;
for (int j = 0 ;j < dp.length; j++){
dp[j] = max;
}
dp[0] = 0;
for(int i = 0; i*i < n ; i++){
for(int j = i*i; j <= n ;j++){
if (dp[j -i*i] != max){
dp[j] = Math.min(dp[j - i*i] + 1, dp[j]);
}
}
}
return dp[n] == max ? -1 : dp[n];
}
}
class Solution {
public boolean wordBreak(String s, List<String> wordDict) {
HashSet<String> set = new HashSet<>(wordDict);
boolean[] dp = new boolean[s.length() +1];
dp[0] = true;
for(int i = 1;i <= s.length() ; i++){
for(int j = 0 ; j < i && !dp[i] ; j++){
if(set.contains(s.substring(j,i)) && dp[j]){
dp[i] = true;
};
}
}
return dp[s.length()];
}
}
class Solution {
public int rob(int[] nums) {
int[] dp = new int[nums.length];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(int i = 2 ; i < nums.length ; i++){
dp[i] = Math.max(dp[i-2] + nums[i] , dp[i-1]);
}
return dp[nums.length -1];
}
}