给定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]; } }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)