01背包问题-动态规划

来源:互联网 发布:c 语言编辑器 编辑:程序博客网 时间:2024/05/29 05:56

程序如下java实现:

import java.util.Scanner;    /**  * 01背包问题  */  public class ZeroOnePack{      public static void main(String[] args)     {          int N;           //背包数目          int[] weight;    //单个物品重量          int[] value;     //单个物品价值          int[][] values ; //存放价值          int maxValue;    //最大价值          Scanner in=new Scanner(System.in);          maxValue=in.nextInt();          N=in.nextInt();          weight=new int[N+1];          value=new int[N+1];          values=new int[N+1][maxValue+1];          for(int i=1;i<=N;i++)        {              weight[i]=in.nextInt();              value[i]=in.nextInt();          }          for(int i=0;i<=N;i++)              values[i][0]=0;          for(int i=0;i<=maxValue;i++)              values[0][i]=0;          /*核心算法*/        for ( int i = 1; i <= N; i++){              for ( int j = 1; j<=maxValue; j++){                  if(weight[i]>j){                      values[i][j]=values[i-1][j];                  }else {                      values[i][j]=Math.max(values[i-1][j-weight[i]]+value[i], values[i-1][j]);                  }              }          }          /*逆向输出*/        for(int i=values.length-1;i>0;i--)        {        for(int j=1;j<values[0].length;j++)        {        if(j==1)        System.out.printf("%d",values[i][j]);        else        System.out.printf("%5d",values[i][j]);        }        System.out.println();        }        System.out.print("最大价值: "+values[N][maxValue]);        in.close();      }  }  
结果如下:

10 5
2 6
2 3
6 5
5 4
4 6
0    6    6    9    9   12   12   15   15   15
0    6    6    9    9    9   10   11   13   14
0    6    6    9    9    9    9   11   11   14
0    6    6    9    9    9    9    9    9    9
0    6    6    6    6    6    6    6    6    6
最大价值: 15

0 1