public class b
{
public static void main(String[] args)
{
int[] w = {1,2,3,4,5};//重量
int[] v = {1,6,18,22,28};//价格
int[][] total = new int [4][11];//总的价格

for (int i=0;i<4;i++)
total[0][i]=0;//第一列为0

for (int i=1;i<4;i++)
{
 for (int j=0;j<11;j++)
 {
  total[i][j]=total[i-1][j];
  if ((total[i-1][j-w[i]]+v[i])>(total[i-1][j]))
   total[i][j]=total[i-1][j-w[i]]+v[i];







}}








 }}

解决方案 »

  1.   

    public class PackageQuestion {public static void knapsack(int[] v, int[] w, int c, int[][] m)
        {/** v[] w[] c 分?是价?、重量、和背包容量数?m[i][j]表示有i~n个物品,背包容量?j的最大价?。*/
        int n = v.length-1;                 
        int jMax = Math.min(w[n]-1, c);
        for(int j = 0; j <= jMax; j++)
           
          m[n][j] = 0;           //当w[n]>j 有 m[n][j]=0
    //m[n][j] 表示只有n物品,背包的容量?j?的最大价?
        for (int l = w[n]; l <= c; l++)
        m[n][l] = v[n];  //当w[n]<j 有m[n][j]=v[n]
    //???用求出m[[]其他直,直到求出m[0][c]
        for(int i = n-1; i >=1; i--)
        {
           jMax = Math.min(w[i]-1,c);
                   
            for(int k = 0; k <=jMax; k++)
                m[i][k] = m[i+1][k];
                         
                 for(int h = w[i]; h <= c; h++)
             m[i][h] = Math.max(m[i+1][h],m[i+1][h-w[i]]+v[i]);
          }
          m[0][c] = m[1][c];
            if(c >= w[0])
              m[0][c] = Math.max(m[0][c],m[1][c-w[0]]+v[0]);
                    System.out.println("bestw ="+m[0][c]);
              }
            
    public static void traceback(int[][] m, int[] w, int c, int[] x)
             {// 根据最??求出最?解
                 int n = w.length-1;
                 for(int i = 0; i<n;i++)
                   if(m[i][c] == m[i+1][c]) x[i] = 0;
                      else {x[i] = 1;
                             c -= w[i];}
                                               
                 x[n] = (m[n][c]>0)?1:0;}
    public static void main(String[] args)
    {//??
    long start, end;
    start = System.currentTimeMillis();
    int[] ww = {2,2,6,5,4};
    int[] vv = {6,3,5,4,6};
    int[][] mm = new int[200][200];
    knapsack(vv,ww,10,mm);
      
       int[] xx =new int[ww.length];
       traceback(mm,ww,10,xx);
       for(int i = 0;i<xx.length;i++)
       {
       System.out.println(xx[i]);
      
       }
       end = System.currentTimeMillis();
       System.out.println(end-start);
       }
    }