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背包问题--C语言代码

01背包问题的c语言代码
  • xuqi7
  • xuqi7
  • 2017年05月18日 17:43
  • 706

动态规划之01背包问题讲解

给大家附上一个题目吧,便于理解 ctest有n个苹果,要将它放入容量为v的背包。给出第i个苹果的大小和价钱,求出能放入背包的苹果的总价钱最大值。 输入:每组测试数据第一行为2个正整数,...
  • su20145104009
  • su20145104009
  • 2016年05月04日 10:21
  • 3429

算法学习笔记(二)——01背包问题之回溯解法

背包问题,相信各位看官肯定都有所耳闻!笔者就在此简单的描述一下背包问题: 给定一背包和n件物品,背包的容量为c,第i件物品的重量为w[i],价值为v[i](1         思路分析:显...
  • renshengkudaun
  • renshengkudaun
  • 2016年04月03日 08:38
  • 3280

ACM:动态规划,01背包问题

题目: 有n件物品和一个容量为C的背包。(每种物品均只有一件)第i件物品的体积是v[i],重量是w[i]。选一些物品装到这个背包中,使得背包内物品在总体积不超过C的前提下重量尽量大。 解法:两...
  • u010470972
  • u010470972
  • 2014年06月19日 11:09
  • 799

01背包问题总结

总结一下 按照:http://blog.csdn.net/libin56842/article/details/9338841 这个博客 提供的题号(感谢大牛) 和自己多加的几道01背包的题目。其状态...
  • yexiaohhjk
  • yexiaohhjk
  • 2015年12月09日 01:08
  • 1147

背包问题01图文附带代码,非常清晰

浅谈DP算法(一)                   ——如何用一维数组解决01背包问题     DP算法(Dynamic Programming,俗称动态规划)是最经典算法之一....
  • wbuhuibiandaima
  • wbuhuibiandaima
  • 2017年03月22日 18:48
  • 1001

动态规划算法-解决01背包问题

问题描述:     现有N个物品,其每个物品对应的重量为Wi,对应的价值为Vi (0 =用C[N][K]可以表示,在一个固定承重为K的背包中放入N个物品时的最大价值。        C[N][K] ...
  • u012787116
  • u012787116
  • 2016年07月24日 14:42
  • 1603

01背包问题详解

首先非常感谢刘汝佳的小白书、HDU刘春英老师的ACM程序设计背包算法课件以及dd_engi的背包九讲和众多大神的博客,看这么多资料最后花了整整一天时间才算大致弄懂了背包问题的思路(=_=搞这么久我确实...
  • qq_33171970
  • qq_33171970
  • 2016年01月25日 13:53
  • 3357

poj1837 动态规划和01背包问题延伸的经典题目,很值得一做

首先说一下基本思路,是按照小优博客上来的思路,即平衡度来做的,其博主在博客上写得已经非常全面了,这里转载一下: 来源:http://blog.csdn.net/lyy289065406/articl...
  • lwtdzh999
  • lwtdzh999
  • 2016年03月13日 21:50
  • 381

动态规划的用法——01背包问题

动态规划的用法——01背包问题   问题主题:著名的01背包问题 问题描述: 有n个重量和价值分别为wi、vi的物品,现在要从这些物品中选出总重量不超过W的物品,求所有挑选方案...
  • luoweifu
  • luoweifu
  • 2014年01月19日 19:10
  • 16041
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01背包问题
举报原因:
原因补充:

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