给定n种物品和一个背包。物品i的重量是wi,体积是bi,其价值为vi,背包的容量为c,容积为d。问应如何选择装入背包中的物品,使得装入背包中物品的总价值最大? 在选择装入背包的物品时,对每种物品只有两个选择:装入或不装入,且不能重复装入。输入数据的第一行分别为:背包的容量c,背包的容积d,物品的个数n。接下来的n行表示n个物品的重量、体积和价值。输出为最大的总价值。
输入样例:
20 15 3
11 7 9
9 5 10
7 10 5
输出样例
19
public class 动态规划算法 {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int c=sc.nextInt();//背包的容量
int d=sc.nextInt();//背包的体积
int n=sc.nextInt();//物品的数量
int[] w=new int[n+1];//物品的重量
int[] b=new int[n+1];//物品的体积
int[] v=new int[n+1];//物品的价值
for (int i = 1; i < w.length; i++) {
w[i]=sc.nextInt();
b[i]=sc.nextInt();
v[i]=sc.nextInt();
}
System.out.println(Track(c,d,n,w,b,v));
}
public static int Track(int c,int d,int n,int[] w,int[] b,int[] v){
int[][][] value=new int[n+1][c+1][d+1];
//int[][][] path=new int[n+1][c+1][d+1];
for (int i = 1; i < n+1; i++) {
for (int j = 1; j < c+1; j++) {
for (int k = 1; k < d+1; k++) {
if(j-w[i]>=0&&k-b[i]>=0){
value[i][j][k]=Math.max(value[i-1][j][k],value[i-1][j-w[i]][k-b[i]]+v[i]);
}
else {
value[i][j][k]=value[i-1][j][k];
}
}
}
}
return value[n][c][d];
}
}



