01背包问题
01背包问题用DP(动态规划实现)
背包容量int c = 10
物品个数int n = 5
物品重量w[] = {0, 2, 2, 6, 5, 4}
物品价值v[] = {0, 6, 3, 5, 4, 6}
结果存放result[][] = new int[n + 1][c + 1]//result[i][j]的意义,i个物品中放到容量为j中最大价值(放或者不放两种情况)
递推关系result[i][j] = max{result[i - 1][j], result[i - 1][j - w[i]] + v[j]}
1 package com.gxf.bag; 2 3 /** 4 * 背包问题 5 * @author Administrator 6 * 7 */ 8 public class Bag { 9 int n = 5;//物品个数 10 int w[] = {0, 2, 2, 6, 5, 4};//物体重量 11 int v[] = {0, 6, 3, 5, 4, 6};//物体价值 12 int c = 10;//背包容量 13 int result[][] = new int[n + 1][c + 1];//注意这里的意义,这里应该可以压缩,最后结果存放在result[n][c]中 14 15 public int getMaxValue(){//result[i][j] 第i个物体放到容量为j的背包中最大价值 16 17 for(int i = 0; i <= n; i++){ 18 for(int j = 0; j <= c; j++){ 19 if(0 == i){ 20 result[i][j] = 0;//没有物品放入,价值为0 21 } 22 else if(j > 0 && j >= w[i]){ 23 result[i][j] = Math.max(result[i - 1][j], result[i - 1][j - w[i]] + v[i]); 24 } 25 } 26 } 27 28 return result[n][c]; 29 } 30 /** 31 * 打印数组result 32 */ 33 public void showResult(){ 34 for(int i = 0; i <= n; i++){ 35 for(int j = 0; j <= c; j++){ 36 System.out.print(result[i][j] + "\t"); 37 } 38 System.out.println(); 39 } 40 } 41 42 /** 43 * 测试 44 * @param args 45 */ 46 public static void main(String args[]){ 47 Bag bag = new Bag(); 48 System.out.println(bag.getMaxValue()); 49 //bag.showResult(); 50 } 51 }
Please call me JiangYouDang!