完全背包
完成
思路:
完全背包和01背包的区别在于,完全背包问题中的物品可以无限取,而01背包中每个物品只能取一次。
体现在代码上就是在遍历背包时,由之前的倒序遍历变成正序遍历。
代码
import java.util.*;
import java.lang.*;
public class Main{
public static void main(String[] args){
Scanner in = new Scanner(System.in);
int N = in.nextInt();
int V = in.nextInt();
int[] dp = new int[V+1];
for (int i=0; i<N; i++){ // 遍历物品
int weight = in.nextInt();
int value = in.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
完成
思路:
本题在01背包出现过,组合问题的递推公式是累加,本题初始化需要注意,如果初始成0,后面所有的结果都是0。
代码
class Solution {
public int change(int amount, int[] coins) {
int[] dp = new int[amount+1];
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];
}
}
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]>=0) dp[j]+=dp[j-nums[i]];
}
}
return dp[target];
}
}