文章目录
- ● 完全背包
- 卡码网: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];
}
}