首页 > 代码库 > 01背包问题

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;//没有物品放入,价值为021                 }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      * 打印数组result32      */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 args45      */46     public static void main(String args[]){47         Bag bag = new Bag();48         System.out.println(bag.getMaxValue());49         //bag.showResult();50     }51 }

 

01背包问题