第七周作业——背包问题

来源:互联网 发布:滴滴服务分刷分软件 编辑:程序博客网 时间:2024/05/18 01:46
import java.io.*;  import java.util.Scanner;    public class Aa {       private int[] v;//存储物品的价值       private int[] w;//存储物品的重量        private int weight;//背包容纳重量       private int num;//物品数量       private int fValue[][];//fValue[i][j]存储前i个物品的重量为j的最大价值       public Aa(int weight,int num){          this.num=num;          this.weight=weight;          this.v=new int[num];          this.w=new int[num];          this.fValue=new int[num+1][weight+1];      }            public int[] getV() {          return v;      }        public void setV(int[] v) {          this.v = v;      }        public int[] getW() {          return w;      }        public void setW(int[] w) {          this.w = w;      }        public int[][] getfValue() {          return fValue;      }        public void setfValue(int[][] fValue) {          this.fValue = fValue;      }      public static void main(String[] args) {          String path="F://Knapsack.txt";          String resultPath="F://KnapsackResult.txt";          Scanner in=null;          PrintWriter writer=null;          try {              in=new Scanner(new File(path));              writer=new PrintWriter(new File(resultPath));              int weight=in.nextInt();//背包总重量               int num=in.nextInt();//物品数量               Aa aa= new Aa(weight,num);//初始化背包               int[] v=aa.getV();              int[] w=aa.getW();              int[][] fvalue=aa.getfValue();              int i=1;              for(i=1;i<=num;i++){//初始化物品价值数组和重量数组                    w[i-1]=in.nextInt();                   v[i-1]=in.nextInt();              }              for(i=1;i<=weight;i++){                  fvalue[0][i]=0;              }              for(i=1;i<=num;i++){                  fvalue[i][0]=0;              }              for(i=1;i<=num;i++){                  for(int j=1;j<=weight;j++){                      if(j<w[i-1]){                          fvalue[i][j]=fvalue[i-1][j];                      }else{                          fvalue[i][j]=Math.max(fvalue[i-1][j], fvalue[i-1][j-w[i-1]]+v[i-1]);                      }                  }              }                            System.out.println("背包中物品的最大价值是:"+fvalue[num][weight]);              aa.back(v, w, fvalue, weight, num);//求出物品编号和背包总重量               System.out.println("构造的二维表格输出结果:");              for(i=1;i<=num;i++){                for(int j=1;j<=weight;j++){                      System.out.print(fvalue[i][j]+" ");                      writer.print(fvalue[i][j]+" ");                  }                  System.out.println();                  writer.println();              }          } catch (Exception e) {              e.printStackTrace();          }finally{              if(in!=null) in.close();              if(writer!=null)  writer.close();          }      }          public void back(int[] v,int[] w,int[][] fvalue,int weight,int num){          int wupinNo[]=new int[num+1];          int j=weight;          for(int i=num;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("背包中物品的编号是:");          for(int i=1;i<=num;i++){              if(wupinNo[i]==1){                  System.out.print(i+" ");                  sumWeight+=w[i-1];              }          }          System.out.println();          System.out.println("背包的总重量是:"+sumWeight);      }  }  

0 0
原创粉丝点击