Java——01背包、完全背包

原创 2018年04月17日 17:19:41

Java—01背包、完全背包

01背包问题的定义:

   有N种物品和一个容量为V的背包,每种物品只能装1件。第i种物品的费用是v,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

 

这里问题具体为:

int[] weight = {0,3,4,5};//重量

       int[] value = {0,4,5,2};//价格

       int max = 10;          //最大载重

   有3种物品和一个容量 int max= 10 的背包, 每种物品无限多,重量和价值分别是 int[] weight = {0,3,4,5}; int[] value ={0,4,5,2};求装入那些物品可使重量不超过背包容量,且价值总和最大。

 

完整代码如下

//   01背包问题

      int[] w = {0,3,4,5};//重量

      int[] v = {0,4,5,6};//价格

      int max = 10;       //最大载重

     

      //创建二维数组,实现所有情况:横向以此是背包载重,纵向是物品列表,将每次最优结果填充到该数组中

      int[][] maxValue = new int[w.length][max];

     

      for(int i=0;i<max;i++){//外层是背包的容量,依次从0-max,一个个测试

         for(int n=0;n<w.length;n++){//每一次背包确定载重时,依次拿物品来装,取得当前载重最高价值

            if(i==0 || n==0){//起始状态

               maxValue[n][i] = 0;

            }

            else{

               //否则,开始判断当前物品能否放到当前载重的背包中

               if(i<w[n]){//当前物品重量是超过载重的,则使用上一次最优结果

                  maxValue[n][i] = maxValue[n-1][i];

               }

               else{

                  //否则,可以放也可以不放,分别计算放 和 不放 的结果

                  int v1 = maxValue[n-1][i];//不放,就是上次最大值了

                  int v2 = maxValue[n-1][i-w[n]] + v[n];//放,则将上一次最大价值加上本次价值

                  maxValue[n][i] = Math.max(v1, v2);

               }

            }

         }

      }

      for(int n=0;n<w.length;n++){

         for(int i=0;i<max;i++){

            System.out.print(maxValue[n][i]+"\t");

         }

         System.out.println();

      }

     

      System.out.println(maxValue[w.length-1][max-1]);

 

如图列表:

 

 

 

 

完全背包问题的定义:

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的费用是v,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

这里问题具体为:

//   完全背包问题

int[] w={0,3,2,5,1,6,4};//重量

       int[] v={0,6,5,10,2,16,8};//价格

   int max = 10;       //最大载重

   6种物品和一个容量 int max= 10 的背包, 每种物品无限多,重量和价值分别是 int[] weight = {0,3,2,5,1,6,4}; int[] value ={0,6,5,10,2,16,8};求装入那些物品可使重量不超过背包容量,且价值总和最大。

 

完整代码如下

int[] w={0,3,2,5,1,6,4};

      int[] v={0,6,5,10,2,16,8};

      int max=10;

     

      int[] m=new int[w.length];

      for(int i=0;i<w.length;i++)

      {

         m[i]=w[i];

      }

      Arrays.sort(m);

     

      int q=max/m[1];

      int[] f=new int[q];     

      int[][] maxValue=new int[w.length][max+1];

     

     

      for(int i=0;i<=max;i++)

      {

         for(int j=0;j<w.length;j++)

         {

            if(i==0||j==0)

            {

               maxValue[j][i]=0;

            }

            else

            {

               if(i<w[j])

               {

                  maxValue[j][i]=maxValue[j-1][i];

               }

               else

               {

                  for(int k=1,g=0;k<=i/w[j];k++,g++)

                  {

                     f[g]=maxValue[j-1][i-(k*w[j])]+k*v[j];

                  }

                  Arrays.sort(f);  

                  int v1=maxValue[j-1][i];

                  maxValue[j][i]=Math.max(v1,f[0]);

                  f=new int[q];

               }

            }

         }

      }

     

      for(int n=0;n<w.length;n++){

         for(int i=0;i<=max;i++){

            System.out.print(maxValue[n][i]+"\t");

         }

         System.out.println();

      }

     

      System.out.println(maxValue[w.length-1][max]);

 



史上最易懂的01背包,完全背包,多重背包讲解

背包之01背包、完全背包、多重背包详解   PS:大家觉得写得还过得去,就帮我把博客顶一下,谢谢。 首先说下动态规划,动态规划这东西就和递归一样,只能找局部关系,若想全部列出来,是很难的,比如汉诺塔。...
  • qq_34374664
  • qq_34374664
  • 2016-08-17 14:02:35
  • 3375

背包问题(01背包和完全背包)一维数组实现

01 背包问题 http://hihocoder.com/problemset/problem/1038 一维数组优化 且说小Ho搞清楚了计算方法,正在埋头苦写代码,在一旁看他写代码...
  • qq_32036091
  • qq_32036091
  • 2016-05-03 09:12:03
  • 2937

[动态规划] 01背包与完全背包

01背包(每种物品的状态为选择或不选择,最多只能选1件): 1.传统的二维数组,第i件物品的重量为w[i],价值为v[i] dp[i][j]保存的是选择前i件物品(每一件物品的状态为选与不选),在...
  • sr19930829
  • sr19930829
  • 2014-11-08 09:40:57
  • 2349

01背包与完全背包微妙的区别

01背包跟完全背包微妙的区别: //完全背包 void solve1() { memset(d, 0, sizeof(d)); for(int i = 0; i < N; i++) for...
  • u011044487
  • u011044487
  • 2014-03-02 14:04:07
  • 1071

01背包,完全背包,多重背包的个人总结

大一刚接触背包问题的时候就觉得绕。那时候真的是一点代码基础都没有强行去理解。每次都是以失败告终,一直到大二都还不会写背包问题。 后来某次模拟赛之后碰到了背包问题,觉得这个还是挺简单的,终于是下定决心准...
  • tinyguyyy
  • tinyguyyy
  • 2016-04-20 22:08:53
  • 7120

背包问题——01背包、完全背包、多重背包、混合三种背包问题

转自: http://apps.hi.baidu.com/share/detail/14968747 P01: 01背包问题 题目 有N件物品和一个容量为V的背包。第i...
  • hcwzq
  • hcwzq
  • 2011-08-04 21:26:43
  • 1785

背包问题详解(01背包,完全背包,多重背包,混合背包,二维费用背包……)

  • 2010年10月16日 22:21
  • 124KB
  • 下载

经典背包问题----(01背包、完全背包、多重背包)

最近在学DP,上周六ACM集训队花一整天的时间共同探讨了最经典的DP--背包问题,对这类问题研究也挺深入的,感谢各队友及老师的讲解,觉得受益匪浅! (1)01背包 01背包算是最基础的背包...
  • AHH_AHHH
  • AHH_AHHH
  • 2017-10-31 19:34:33
  • 52

背包问题详解:01背包、完全背包、多重背包

参考链接: http://www.cnblogs.com/fengty90/p/3768845.html http://blog.csdn.net/mu399/article/details/7722...
  • na_beginning
  • na_beginning
  • 2017-03-17 11:47:48
  • 14759

01背包,完全背包,多重背包问题详细介绍以及源代码实现

背包问题 部分内容转载自:http://www.cppblog.com/tanky-woo/archive/2010/07/31/121803.html 背包的基本模型就是给你一个容量为V的背包 ...
  • tingting256
  • tingting256
  • 2016-04-14 13:58:19
  • 2516
收藏助手
不良信息举报
您举报文章:Java——01背包、完全背包
举报原因:
原因补充:

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