01背包问题

来源:互联网 发布:sql注入漏洞修复工具 编辑:程序博客网 时间:2024/05/19 08:01
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

0 0
原创粉丝点击