import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class OneZeroBag {
public static class Item{
char name;
int weight;
int value;
public Item(char name, int weight, int value) {
this.name = name;
this.weight = weight;
this.value = value;
}
@Override
public String toString() {
return "Item{" +
"name=" + name +
", weight=" + weight +
", value=" + value +
'}';
}
}
public static int get01PackageMaxValue(List<Item> items, int capacity, List<Item> selectedItems){
int[][] dp = new int[items.size()+1][capacity+1];
for(int[] dpi : dp) {
Arrays.fill(dpi, 0);
}
boolean[] selected = new boolean[items.size()];
Arrays.fill(selected, false);
for(int currCapacity = 1; currCapacity <= capacity; currCapacity++){
for(int i = 0; i < items.size(); i++){
int currItemIndex = i + 1;
Item currItem = items.get(i);
if(currItem.weight <= currCapacity){
dp[currItemIndex][currCapacity] = Math.max(dp[currItemIndex-1][currCapacity-currItem.weight] + currItem.value,
dp[currItemIndex-1][currCapacity]);
}else {
dp[currItemIndex][currCapacity] = dp[currItemIndex-1][currCapacity];
}
}
}
System.out.println("二维数组:");
for(int[] arr : dp){
System.out.println(Arrays.toString(arr));
}
int capacityTemp = capacity;
for (int k = items.size()-1; k >= 0; k--){
Item item = items.get(k);
int index = k+1;
if(dp[index][capacityTemp] == dp[index-1][capacityTemp-item.weight] + item.value){
capacityTemp -= item.weight;
selectedItems.add(item);
}
}
return dp[items.size()][capacity];
}
public static void main(String[] args){
List<Item> items = new ArrayList<>(Arrays.asList(new Item('a', 2, 6),
new Item('b', 2, 3),
new Item('c', 6, 5),
new Item('d', 5, 4),
new Item('e', 4, 6)));
List<Item> selectedItems = new ArrayList<>();
int maxValue = get01PackageMaxValue(items, 10, selectedItems);
System.out.println("max value:" + maxValue);
System.out.println("selected items:" + selectedItems);
}
}
参考资料写的很好:
http://blog.csdn.net/wumuzi520/article/details/7014559
http://blog.csdn.net/mu399/article/details/7722810