目录
一、题目描述
二、整体思路
和完全背包问题唯一不同的是物品的件数不再是无限了,而是有限的。那么只需要在完全背包问题的基础上把最大遍历次数变成物品总件数
和当前背包能放入物品的最大件数
两者取其小即可。
三、代码
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
int m=scanner.nextInt();
int n=scanner.nextInt();
int[] volume=new int[m+1];
int[] value=new int[m+1];
int[] finite=new int[m+1];
for(int i=1;i<=m;i++){
int vi=scanner.nextInt();
int wi=scanner.nextInt();
int si=scanner.nextInt();
volume[i]=vi;
value[i]=wi;
finite[i]=si;
}
System.out.print(dynamatic(m,n,volume,value,finite));
}
public static int dynamatic(int m,int n,int[] volume,int[] value,int[] finite){
int[][] dp=new int[m+1][n+1];
for(int i=0;i<=n;i++){
dp[0][i]=0;
}
for(int j=0;j<=m;j++){
dp[j][0]=0;
}
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(volume[i]>j){
dp[i][j]=dp[i-1][j];
}else{
int k=Math.min(finite[i],j/volume[i]);//两者取其小
for(int l=0;l<=k;l++){
dp[i][j]=Math.max(dp[i][j],dp[i-1][j-l*volume[i]]+l*value[i]);
}
}
}
}
return dp[m][n];
}
}