01背包问题

问题:给定n种物品和一个背包,物品i(1小于等于i小于等于n)的重量是Wi,其价值为Vi,背包容量为C,对每种物品只有两种选择:装入背包或者不装入背包。如下选择装入背包装入别爆的物品,使得装入背包中物品的总价值最大?

特点:每种物品仅有一件,可选择放或者不放。

用子问题定义状态:即f[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:

f[i][v]=max{f[i-1][v],f[i-1][v-c[i]]+w[i]}

若放入第i件物品即“前i-1件物品放入剩下的容量为v-c[i]的背包中”,此时能获得的最大价值就是f[i-1][v-c[i]]再加上通过放入第i件物品获得的价值w[i]。

若不放入第i件物品即“前i-1件物品放入容量为v的背包中”,价值为f[i-1][v];

public class Bag

{

     public int getMaxValue[][](int  weight[], int value[])

         {

                int lenRow=weight.lenght;

                int lenColumn=0;

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

                           lenColumn+=weight[i];

                           int  F[][]=new int [lenRow][lenColumn];

                            for(int i=1;i<weight.length;i++)

                               {

                                         for(int j=0;j<lenColumn;j++)

                                                {

                                                            if(weight[i]>j)

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

                                                               else 

                                                                      {

                                                                               if(F[i-1][j]>F[i-1][j-weight[i]]+value[i])

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

                                                                               else

                                                                                         F[i][j]=F[i-1][j-weight[i]]+balue[i]   ;

                                                                      }

                                                 }

                                }

                          return F;

          }



                public static void  main(String args[])

                          {

                                      Bag    test=new Bag();

                                         int[] weight = {2,1,3,2};
                                        int[] value = {12,10,20,15};
                                        int[][] F = test.getMaxValue(weight, value);

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

                                               {
                                                         for(int j = 0;j < F[0].length;j++) 
                                                         System.out.print(F[i][j]+"\t");
                                                          System.out.println();

                                              }

                          }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值