第7周作业1——背包问题

来源:互联网 发布:58上好多开淘宝店 编辑:程序博客网 时间:2024/04/29 21:17

1、背包问题。对上文中提到的背包问题提供的表1(第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。

源码:

import java.io.File;  import java.io.PrintWriter;  import java.util.Scanner;    public class Knapsack {      private int[] Value;//存储物品的价值      private int[] Weight;//存储物品的重量       private int allWeight;//背包容纳重量      private int allNum;//物品数量      private int BValue[][];//BValue[i][j]存储前i个物品的重量为j的最大价值      public Knapsack(int allWeight,int allNum){          this.setAllNum(allNum);          this.setAllWeight(allWeight);          this.Value=new int[allNum];          this.Weight=new int[allNum];          this.BValue=new int[allNum+1][allWeight+1];      }           public int[] getV() {          return Value;      }       public void setV(int[] v) {          this.Value = v;      }       public int[] getW() {          return Weight;      }        public void setW(int[] w) {          this.Weight = w;      }        public int[][] getBValue() {          return BValue;      }       public void setBValue(int[][] fValue) {          this.BValue = fValue;      }      public static void main(String[] args) {          String path="src/Knapsack.txt";          String resultPath="src/KnapsackResult.txt";          Scanner scanner=null;          PrintWriter pw=null;          try {              scanner=new Scanner(new File(path));              pw=new PrintWriter(new File(resultPath));              int allWeight=scanner.nextInt();//背包所能容纳的总重量              int allNum=scanner.nextInt();//物品数量              Knapsack kna= new Knapsack(allWeight,allNum);//初始化背包              int[] v=kna.getV();              int[] w=kna.getW();              int[][] BValue=kna.getBValue();              int i=1;              for(i=1;i<=allNum;i++){//初始化物品价值数组和重量数组                   w[i-1]=scanner.nextInt();                   v[i-1]=scanner.nextInt();              }              for(i=1;i<=allNum;i++){                  BValue[i][0]=0;              }              for(i=1;i<=allWeight;i++){              BValue[0][i]=0;              }              for(i=1;i<=allNum;i++){                  for(int j=1;j<=allWeight;j++){                      if(j<w[i-1]){                      BValue[i][j]=BValue[i-1][j];                      }else{                      BValue[i][j]=Math.max(BValue[i-1][j], BValue[i-1][j-w[i-1]]+v[i-1]);                      }                  }              }              System.out.println("背包中物品的最大价值是:"+BValue[allNum][allWeight]);              kna.traceBack(v, w, BValue, allWeight, allNum);//求出物品编号和背包总重量              System.out.println("构造的二维表格输出结果:");              for(i=1;i<=allNum;i++){//输出二维数组到文本文件KnapsackResult.txt中                  for(int j=1;j<=allWeight;j++){                      System.out.print(BValue[i][j]+" ");                      pw.print(BValue[i][j]+" ");                  }                  System.out.println();                  pw.println();              }          } catch (Exception e) {              // TODO Auto-generated catch block              e.printStackTrace();          }finally{              if(scanner!=null) scanner.close();              if(pw!=null)  pw.close();          }      }         /**      * 回溯法逆序找到背包的物品编号      * @param v 存储物品的价值      * @param w 存储物品的重量       * @param fvalue fValue[i][j]存储前i个物品的重量为j的最大价值      * @param allWeight 背包容纳重量      * @param allNum 物品数量      */      public void traceBack(int[] v,int[] w,int[][] fvalue,int allWeight,int allNum){          int wupinNo[]=new int[allNum+1];          int j=allWeight;          for(int i=allNum;i>0;i--){              if(fvalue[i][j]>fvalue[i-1][j]){                  wupinNo[i]=1;                  j-=w[i-1];                  if(j<0){                      break;                  }              }          }          int sumWeight=0;//记录背包的总重量          System.out.println();          System.out.println("背包中物品的编号是:");          for(int i=1;i<=allNum;i++){              if(wupinNo[i]==1){                  System.out.print(i+" ");                  sumWeight+=w[i-1];              }          }          System.out.println();          System.out.println();          System.out.println("背包的总重量是:"+sumWeight);          System.out.println();      }public void setAllWeight(int allWeight) {this.allWeight = allWeight;}public int getAllWeight() {return allWeight;}public void setAllNum(int allNum) {this.allNum = allNum;}public int getAllNum() {return allNum;}  } 

运行结果:


0 0
原创粉丝点击