1.题目描述

题目解答
这道题涉及到动态规划的完全背包,而不是0/1背包,这两者的区别就是完全背包可以将一个元素重复使用多次,而不是像01背包一样只能使用一次,同时,这道完全背包求的是达成目标的最小次数,0/1背包求得的是能获取到的最大的价值,这两者完全不同。
对于此题,我们可以设置一个一维数组,用于记录在每一个最大数量amount面前能凑成的最少硬币数量。最大数量amount即为数组的下标。



java
class Solution {
public int coinChange(int[] coins, int amount) {
int dp[] =new int [amount+1];
Arrays.fill(dp,Integer.MAX_VALUE-1);
dp[0] = 0;
for(int i=1;i<=amount;i++){
for(int coin:coins){
if(i>=coin){
dp[i] = Math.min(dp[i],dp[i-coin]+1);
}
}
}
return dp[amount] > amount ? -1 : dp[amount];
}
}
2.题目描述

题目解答
这道题和上一道题的大概思路都是如出一辙的,唯一不同的就是元素从硬币变成了平方数,我们只需要在内层循环一遍遍计算小于当前n的平方数就行。
java
class Solution {
public int numSquares(int n) {
int[] dp =new int[n+1];
Arrays.fill(dp,Integer.MAX_VALUE-9);
dp[0]= 0;
//每一步都在当前的节点去尝试
for(int i=1;i<=n;i++){
for(int j = 1;j*j<=i;j++){
dp[i]=Math.min(dp[i],dp[i-j*j]+1);
}
}
return dp[n];
}
}