Java——01背包、完全背包

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]);

 



阅读更多
文章标签: 算法
个人分类: 算法
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭