题目来源
相当于有N种物品,每种物品有S+1种选法
dp[i][j] =max(dp[i-1][j],dp[i-1][j-v1]+w1,…,dp[i-1][j-vs]+ws)
=>
j从大到小遍历
dp[j] =max(dp[j],dp[j-v1]+w1,…,dp[j-vs]+ws)
具体代码
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int groupNum = sc.nextInt();
int weight = sc.nextInt();
int dp[] = new int[weight+1];
for(int i = 0;i < groupNum;i++){
int memberNum = sc.nextInt();
int v[] = new int[memberNum];
int w[] = new int[memberNum];
for(int s = 0;s < memberNum;s++){
v[s] = sc.nextInt();
w[s] = sc.nextInt();
}
for(int j = weight;j >= 0;j--){
for(int k = 0;k < memberNum;k++)
if(j >= v[k])
dp[j] = Math.max(dp[j],dp[j-v[k]]+w[k]);
}
}
System.out.println(dp[weight]);
}
}
多重背包问题是特殊的分组背包问题,也是N种物品,S+1种选法。
参考资料
https://www.acwing.com/problem/content/video/9/