文章目录
- ● 完全背包
- 卡码网:52. 携带研究材料-完全背包理论练习
- 代码:
- ● 518. 零钱兑换 II
- 思路:
- 五部曲
- 代码:滚动数组
- 代码二:二维数组
- ● 377. 组合总和 Ⅳ
- 思路:
- 五部曲
- 代码:
● 完全背包
卡码网:52. 携带研究材料-完全背包理论练习
代码:
import java.util.*;public class Main{public static void main(String[] args){Scanner sc = new Scanner(System.in);int N=sc.nextInt();int V = sc.nextInt();int[] dp=new int[V+1];for(int i=0;i<N;i++){int weight=sc.nextInt();int value = sc.nextInt();for(int j=weight;j<=V;j++){dp[j]=Math.max(dp[j],dp[j-weight]+value);}}System.out.println(dp[V]);}
}
● 518. 零钱兑换 II
思路:
五部曲
代码:滚动数组
class Solution {public int change(int amount, int[] coins) {// if()return 0;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]=Math.max(dp[j],dp[j-coins[i]]+1);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 <= amount; i += coins[0]) {dp[0][i] = 1;}for (int i = 1; i < coins.length; i++) {for (int j = 0; j <= amount; j++) {// 第i种硬币使用0~k次,求和for (int k = 0; k * coins[i] <= j; k++) {dp[i][j] += dp[i - 1][j - k * coins[i]];}}}return dp[coins.length - 1][amount];}
}
● 377. 组合总和 Ⅳ
思路:
五部曲
代码:
class Solution {public int combinationSum4(int[] nums, int target) {int[] dp=new int[target+1];dp[0]=1;for(int j=0;j<=target;j++){for(int i=0;i<nums.length;i++){if(j>=nums[i])dp[j]+=dp[j-nums[i]];}}return dp[target];}
}