01背包问题

原创 2016年05月31日 21:59:00
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

01背包问题

  • 2014年09月17日 20:01
  • 527B
  • 下载

01背包問題,用跳越點解

  • 2013年11月16日 19:04
  • 6KB
  • 下载

01背包问题(动态规划)python实现

在01背包问题中,在选择是否要把一个物品加到背包中,必须把该物品加进去的子问题的解与不取该物品的子问题的解进行比较,这种方式形成的问题导致了许多重叠子问题,使用动态规划来解决。n=5是物品的数量,c=...

c c++ 01背包问题动态规划解决

  • 2013年11月05日 16:45
  • 28KB
  • 下载

01背包问题

  • 2016年03月24日 10:04
  • 40KB
  • 下载

贪心算法_01背包问题_Java实现

什么是贪心算法?是指在对问题进行求解时,总是做出当前看来是最好的选择。也就是说,不从整体最优上加以考虑,所得出的结果仅仅是某种意义上的局部最优解。因此贪心算法不会对所有问题都能得到整体最优解,但对于很...

遗传算法解决01背包问题

  • 2015年03月06日 21:04
  • 381KB
  • 下载

01背包问题(用c语言实现)-回溯法求解

回溯法求解01背包   用回溯法解问题时,应明确定义问题的解空间。问题的解空间至少应包含问题的一个(最优)解。例如,对于有n种可选择物品的0-1背包问题,其解空间由长度为n的0-1向量组成。该解空间包...

01背包问题

  • 2013年03月25日 21:34
  • 4KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01背包问题
举报原因:
原因补充:

(最多只允许输入30个字)