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 }

 

posted on 2014-11-13 19:49  luckygxf  阅读(165)  评论(0编辑  收藏  举报

导航