赞
踩
- class Solution {
- public int change(int amount, int[] coins) {
- //递推表达式
- int[] dp = new int[amount + 1];
- //初始化dp数组,表示金额为0时只有一种情况,也就是什么都不装
- dp[0] = 1;
- for (int i = 0; i < coins.length; i++) {
- for (int j = coins[i]; j <= amount; j++) {
- dp[j] += dp[j - coins[i]];
- }
- }
- return dp[amount];
- }
- }
- // 二维dp数组版本,方便理解
- class Solution {
- public int change(int amount, int[] coins) {
- int[][] dp = new int[coins.length][amount+1];
-
- // 初始化边界值
- for(int i = 0; i < coins.length; i++){
- // 第一列的初始值为1
- dp[i][0] = 1;
- }
- for(int j = coins[0]; j <= amount; j++){
- // 初始化第一行
- dp[0][j] += dp[0][j-coins[0]];
- }
-
- for(int i = 1; i < coins.length; i++){
- for(int j = 1; j <= amount; j++){
- if(j < coins[i]) dp[i][j] = dp[i-1][j];
- else dp[i][j] = dp[i][j-coins[i]] + dp[i-1][j];
- }
- }
-
- return dp[coins.length-1][amount];
- }
- }

- class Solution {
- public int combinationSum4(int[] nums, int target) {
- int[] dp = new int[target + 1];
- dp[0] = 1;
- for (int i = 0; i <= target; i++) {
- for (int j = 0; j < nums.length; j++) {
- if (i >= nums[j]) {
- dp[i] += dp[i - nums[j]];
- }
- }
- }
- return dp[target];
- }
- }
第三题:爬楼梯进阶
感觉今天学的技巧性都挺强的,完全背包的还得再看看;
如果求组合数就是外层for循环遍历物品,内层for遍历背包。
如果求排列数就是外层for遍历背包,内层for循环遍历物品。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。