Day45 动态规划 part07
我的思路:
和昨天的组合总和题几乎一模一样的代码
解答:
import java.util.*;
public class Main {
public static void main (String[] args) {
Scanner myScanner = new Scanner(System.in);
int n = myScanner.nextInt();
int m = myScanner.nextInt();
int[] steps = new int[m];
for(int i = 0; i < m; i++) {
steps[i] = i + 1;
}
BagProblem(steps, n);
}
public static void BagProblem(int[] steps, int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
for(int i = 0; i < dp.length; i++) {
for(int step: steps) {
if(i >= step) {
dp[i] += dp[i - step];
}
}
}
System.out.println(dp[n]);
}
}
我的思路:
这次的状态转移方程是dp[i] = Math.min(dp[i], dp[i - j *j] + 1),比较自身与dp数组中i - j *j与j *j的组合(该情况的组合数就是dp[i - j *j] + 1)
因为是比最小,初始化dp数组值为无穷大Integer.MAX_VALUE
解答:
class Solution {
public int numSquares(int n) {
int[] dp = new int[n + 1];
for(int i = 1; i < dp.length; i++) {
dp[i] = Integer.MAX_VALUE;
for(int j = 1; j *j <= i; j++) {
dp[i] = Math.min(dp[i], dp[i - j *j] + 1);
}
}
return dp[n];
}
}
我的思路:
和上一题一样,考察组合,数字可以重复使用
状态转移方程模仿可以写出,dp[j] = Math.min(dp[j], dp[j - coins[i]] + 1)
这里为了方便比较(存在无法组合输出-1的情况),比较更小值的时候,没有用Integer.MAX_VALUE,用的amount + 1
解答:
class Solution {
public int coinChange(int[] coins, int amount) {
int[] dp = new int[amount + 1];
Arrays.fill(dp, amount + 1);
dp[0] = 0;
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] > amount ? -1 : dp[amount];
}
}