第七周作业

  1. import java.io.File;        
  2. import java.io.FileNotFoundException;        
  3. import java.io.PrintWriter;        
  4. import java.util.Scanner;        
  5.         
  6. public class Knapsack {        
  7.         
  8.     private int[] v;//存储物品的价值         
  9.     private int[] w;//存储物品的重量          
  10.     private int allWeight;//背包容纳重量         
  11.     private int allNum;//物品数量         
  12.     private int fValue[][];//fValue[i][j]存储前i个物品的重量为j的最大价值         
  13.     public Knapsack(int allWeight,int allNum){        
  14.         this.allNum=allNum;        
  15.         this.allWeight=allWeight;        
  16.         this.v=new int[allNum];        
  17.         this.w=new int[allNum];        
  18.         this.fValue=new int[allNum+1][allWeight+1];        
  19.     }        
  20.             
  21.     public int[] getV() {        
  22.         return v;        
  23.     }        
  24.         
  25.     public void setV(int[] v) {        
  26.         this.v = v;        
  27.     }        
  28.         
  29.     public int[] getW() {        
  30.         return w;        
  31.     }        
  32.         
  33.     public void setW(int[] w) {        
  34.         this.w = w;        
  35.     }        
  36.         
  37.     public int[][] getfValue() {        
  38.         return fValue;        
  39.     }        
  40.         
  41.     public void setfValue(int[][] fValue) {        
  42.         this.fValue = fValue;        
  43.     }        
  44.     public static void main(String[] args) {        
  45.         String path="E:\\Knapsack.txt";        
  46.         String resultPath="E:\\KnapsackResult.txt";        
  47.         Scanner scanner=null;        
  48.         PrintWriter writer=null;        
  49.         try {        
  50.             scanner=new Scanner(new File(path));        
  51.             writer=new PrintWriter(new File(resultPath));        
  52.             int allWeight=scanner.nextInt();//背包总重量         
  53.             int allNum=scanner.nextInt();//物品数量         
  54.             Knapsack kna= new Knapsack(allWeight,allNum);//初始化背包         
  55.             int[] v=kna.getV();        
  56.             int[] w=kna.getW();        
  57.             int[][] fvalue=kna.getfValue();        
  58.             int i=1;        
  59.             for(i=1;i<=allNum;i++){//初始化物品价值数组和重量数组         
  60.                  w[i-1]=scanner.nextInt();        
  61.                  v[i-1]=scanner.nextInt();        
  62.             }        
  63.             for(i=1;i<=allNum;i++){        
  64.                 fvalue[i][0]=0;        
  65.             }        
  66.             for(i=1;i<=allWeight;i++){        
  67.                 fvalue[0][i]=0;        
  68.             }        
  69.             for(i=1;i<=allNum;i++){        
  70.                 for(int j=1;j<=allWeight;j++){        
  71.                     if(j<w[i-1]){        
  72.                         fvalue[i][j]=fvalue[i-1][j];        
  73.                     }else{        
  74.                         fvalue[i][j]=Math.max(fvalue[i-1][j], fvalue[i-1][j-w[i-1]]+v[i-1]);        
  75.                     }        
  76.                 }        
  77.             }        
  78.                     
  79.             System.out.println("背包中物品的最大价值是:"+fvalue[allNum][allWeight]);        
  80.             kna.traceBack(v, w, fvalue, allWeight, allNum);//求出物品编号和背包总重量         
  81.             System.out.println("构造的二维表格输出结果:");        
  82.             for(i=1;i<=allNum;i++){//输出二维数组到文本文件KnapsackResult.txt中         
  83.                 for(int j=1;j<=allWeight;j++){        
  84.                     System.out.print(fvalue[i][j]+" ");        
  85.                     writer.print(fvalue[i][j]+" ");        
  86.                 }        
  87.                 System.out.println();        
  88.                 writer.println();        
  89.             }        
  90.         } catch (Exception e) {        
  91.             
  92.             e.printStackTrace();        
  93.         }finally{        
  94.             if(scanner!=null) scanner.close();        
  95.             if(writer!=null)  writer.close();        
  96.         }        
  97.     }           
  98.           
  99.     public void traceBack(int[] v,int[] w,int[][] fvalue,int allWeight,int allNum){        
  100.         int wupinNo[]=new int[allNum+1];        
  101.         int j=allWeight;        
  102.         for(int i=allNum;i>0;i--){        
  103.             if(fvalue[i][j]>fvalue[i-1][j]){        
  104.                 wupinNo[i]=1;        
  105.                 j-=w[i-1];        
  106.                 if(j<0){        
  107.                     break;        
  108.                 }        
  109.             }        
  110.         }        
  111.         int sumWeight=0;//记录背包的总重量         
  112.         System.out.println("背包中物品的编号是:");        
  113.         for(int i=1;i<=allNum;i++){        
  114.             if(wupinNo[i]==1){        
  115.                 System.out.print(i+" ");        
  116.                 sumWeight+=w[i-1];        
  117.             }        
  118.         }        
  119.         System.out.println();        
  120.         System.out.println("背包的总重量是:"+sumWeight);        
  121.     }        
  122. }        
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值