题目:题目链接

import java.util.Scanner;import java.util.ArrayList;public class Main{public static void main(String[] args){Scanner sc=new Scanner(System.in);int N=sc.nextInt();int V=sc.nextInt();ArrayList<int[]> al=new ArrayList<>();for(int i=0;i<N;i++){int v=sc.nextInt();int w=sc.nextInt();int s=sc.nextInt();if(s==-1){al.add(new int[]{-1,v,w});}if(s==0){al.add(new int[]{0,v,w});}if(s>0){for(int k=1;k<=s;k++){s=s-k;al.add(new int[]{-1,k*v,k*w});}if(s!=0){al.add(new int[]{-1,s*v,s*w});}}}int[] dp=new int[V+1];for(int i=0;i<al.size();i++){if(al.get(i)[0]==-1){for(int j=V;j>=al.get(i)[1];j--){dp[j]=Math.max(dp[j],dp[j-al.get(i)[1]]+al.get(i)[2]);}}if(al.get(i)[0]==0){for(int j=al.get(i)[1];j<=V;j++){dp[j]=Math.max(dp[j],dp[j-al.get(i)[1]]+al.get(i)[2]);}}}System.out.println(dp[V]);}}
就是把多重背包 问题优化转到01背包问题,然后每个状态的转化要根据条件来做选择,也就是说不是一个dp方程了,但是对于某个物品 时候是同一个。根据到选 某个物品,状态选择(或者叫做dp方程)发生改变。
