案例:背包容量为12kg,货物种类3种,3种货物重量分别为4,5,7,三种货物价值价值分别是500元,600元,800元,求能容纳最大价值;
横向代表当前背包容量,纵向代表放入第n个货物,方格表示当前背包容量下放入第n个货物的最大价值。
放入的情况
放入的情况在容量为11的情况下,放入第一个货物,能放下,最大价值为500,放入第二个货物,能放下,如果放下价值为600,加上剩余空间最大价值11-5=7,而目前容量为7的最大价值是500,500+600>500所以放入,并且最大价值变成1100;放入第三个货物,能放下,如果放下价值为800,加上剩余容量最大价值11-7=4,目前容量为4的最大价值为500,500+800>1100放入;
不放入的情况
容量为9的情况下,放入第3个货物,可以放下,放下后价值为800,加上剩余容量最大价值9-7=2,2的最大价值为0,所以800+0<1100,所以不放入。
实现
import java.util.Scanner;
public class C1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
String[] split = s.split(",");
//背包容量
int N=Integer.parseInt(split[0]);
//货物种类
int m=Integer.parseInt(split[1]);
//货物重量数组
String[] st = split[2].split(" ");
//货物价值数组
String[] sv = split[3].split(" ");
int[] stArray = new int[m];
int[] svArray = new int[m];
for (int i = 0; i < m; i++) {
stArray[i]=Integer.parseInt(st[i]);
svArray[i]=Integer.parseInt(sv[i]);
}
int[][] dp = new int[m + 1][N+1];
for (int i = 1; i <= m; i++) {
for (int j = 1; j <=N; j++) {
//可以放下
if (stArray[i-1]<=j){
//比较放下的货物价值加上剩余容量最大价值与不放货物的最大价值
dp[i][j]=Math.max(svArray[i-1]+dp[i-1][j-stArray[i-1]],dp[i-1][j]);
}else { //放不下
dp[i][j]=dp[i-1][j];
}
}
}
System.out.println(dp[m][N]);
}
}