完全背包理论
题目描述
小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的重量,并且具有不同的价值。小明的行李箱所能承担的总重量为 N,问小明应该如何抉择,才能携带最大价值的研究材料,每种研究材料可以选择无数次,并且可以重复选择。
输入描述 第一行包含两个整数,N,V,分别表示研究材料的种类和行李空间
接下来包含 N 行,每行两个整数 wi 和 vi,代表第 i 种研究材料的重量和价值
输出描述 输出一个整数,表示最大价值。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner s = new Scanner(System.in);
int types = s.nextInt();
int capacity = s.nextInt();
List<int[]> list = new ArrayList<>();
while(s.hasNext()){
int a = s.nextInt();
int b = s.nextInt();
list.add(new int[]{a, b});
}
int[] dp = new int[capacity + 1];
for(int i = 0; i < types; i++){
for(int j = 1; j <= capacity; j++){
if(j >= list.get(i)[0]){
dp[j] = Math.max(dp[j], dp[j-list.get(i)[0]] + list.get(i)[1]);
}
}
}
System.out.println(dp[capacity]);
}
}
- 组合总和 Ⅳ
class Solution {
public int combinationSum4(int[] nums, int target) {
//dp[j] 代表总和是j的组合最大个数
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];
}
}
- 零钱兑换 II
class Solution {
public int change(int amount, int[] coins) {
//dp[j] 总金额j的货币组合数为dp[j]
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]];
}
// for(int j = amount;j>= coins[i];j--){
// dp[j] += dp[j-coins[i]];
// }
}
return dp[amount];
}
}