public class Package {
public static void main(String[] args) {
int W=10;
int[] w={2,3,2,5};
int[] v={3,4,5,6};
int[] k={2,1,2,1};
System.out.println(package01(W,w,v));//res=15
System.out.println(packageFull(W,w,v));//res=25
System.out.println(packageK(W,w,v,k));//res=17
}
public static int package01(int W,int[] w,int[] v){
int len=w.length;
int[][] dp=new int[len+1][W+1];
for(int i=1;i<=len;i++){
for(int j=1;j<=W;j++){
if(w[i-1]>j){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-w[i-1]]+v[i-1]);
}
}
}
return dp[len][W];
}
public static int packageFull(int W,int[] w,int[] v){
int len=w.length;
int[][] dp=new int[len+1][W+1];
for(int i=1;i<=len;i++){
for(int j=1;j<=W;j++){
if(w[i-1]>j){
dp[i][j]=dp[i-1][j];
}else{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-w[i-1]]+v[i-1]);
}
}
}
return dp[len][W];
}
public static int packageK(int W,int[] w,int[] v,int[] K){
int len=w.length;
int[][] dp=new int[len+1][W+1];
for(int i=1;i<=len;i++){
for(int j=1;j<=W;j++){
for(int k=0;k<=K[i-1];k++) {
if (k*w[i-1] <= j) {
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j - k*w[i-1]] + k*v[i-1]);
}
}
}
}
return dp[len][W];
}
}