问题:
有 N 件物品和一个容量为 M 的背包。第 i 件物品的体积是w[i],价值是p[i]。求解将哪些物品装入背包可使这些物品的体积总和不超过背包容量,且价值总和最大。
分析:
这个问题的难点在于它有很多种组合情况,所以,这个问题看似很难在 polynomial 时间内找出最优解。但是,我们的确可以在polynomial时间内找出来。
思路如下:
对于问题本身,背包的容量是物品的个数是固定,但是我们现在假设(只是假设)只有一个物品,它的价值是 5,体积是4。当背包的容量从0到9增加的时候,我们发现,当背包的体积小于4的时候,这个物品是无法放下去的,但是,当背包容量大于等于4的时候,该物品可以放下去,这个时候,背包的价值是 5. 如下表:
容积 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
价值 | 0 | 0 | 0 | 0 | 5 | 5 | 5 | 5 | 5 | 5 |
public class BackPack { public static void main(String[] args) { int n = 4; //number of items int volume = 20; // the volume of the backpack Random rd = new Random(); Item[] items = new Item[n]; for (int i = 0; i < n; i++) { int size = rd.nextInt(20) + 1; int value = rd.nextInt(10) + 1; items[i] = new Item(size, value); } print(items); System.out.println("The maximum value of the backpack is " + maxValue(items, volume)); } public static int maxValue(Item[] items, int volume) { //number of items int numItem = items.length; int[][] valueTable = new int[numItem + 1][volume + 1]; // i refers to the ith item for (int i = 1; i <= numItem; i++) { // j refers to the volume for (int j = 1; j <= volume; j++) { int size = items[i-1].size; int value = items[i-1].value; valueTable[i][j] = Math.max(getTableValue(valueTable, i-1, j), size <= j ? getTableValue(valueTable, i-1, j-size) + value : 0); } } print(valueTable); return valueTable[numItem][volume]; } public static int getTableValue(int[][] valueTable, int i, int j) { if (i >= 0 && j >= 0) { return valueTable[i][j]; } return 0; } //print items public static void print(Item[] items) { System.out.println("Value Size"); for (Item item : items) { System.out.println(item.value + " "+ item.size); } } // print value table public static void print(int[][] table) { for (int i = 0; i < table.length; i++) { for (int j = 0; j < table[0].length; j++) { System.out.print(table[i][j] + " "); } System.out.println(); } } } class Item { int size = 0; int value = 0; public Item(int size, int value) { this.size = size; this.value = value; } }参考: http://hi.bccn.net/space-339919-do-blog-id-14722.html