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

来源:互联网 发布:java目标字符串替换 编辑:程序博客网 时间:2024/04/29 22:00
package pack;    import java.io.File;    import java.io.FileNotFoundException;    import java.io.PrintWriter;    import java.util.Scanner;        public class Knapsack {            private int[] v;//存储物品的价值         private int[] w;//存储物品的重量          private int allWeight;//背包容纳重量         private int allNum;//物品数量         private int fValue[][];//fValue[i][j]存储前i个物品的重量为j的最大价值         public Knapsack(int allWeight,int allNum){            this.allNum=allNum;            this.allWeight=allWeight;            this.v=new int[allNum];            this.w=new int[allNum];            this.fValue=new int[allNum+1][allWeight+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="E:\\Knapsack.txt";            String resultPath="E:\\KnapsackResult.txt";            Scanner scanner=null;            PrintWriter writer=null;            try {                scanner=new Scanner(new File(path));                writer=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[][] fvalue=kna.getfValue();                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++){                    fvalue[i][0]=0;                }                for(i=1;i<=allWeight;i++){                    fvalue[0][i]=0;                }                for(i=1;i<=allNum;i++){                    for(int j=1;j<=allWeight;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[allNum][allWeight]);                kna.traceBack(v, w, fvalue, allWeight, allNum);//求出物品编号和背包总重量                 System.out.println("构造的二维表格输出结果:");                for(i=1;i<=allNum;i++){//输出二维数组到文本文件KnapsackResult.txt中                     for(int j=1;j<=allWeight;j++){                        System.out.print(fvalue[i][j]+" ");                        writer.print(fvalue[i][j]+" ");                    }                    System.out.println();                    writer.println();                }            } catch (Exception e) {                        e.printStackTrace();            }finally{                if(scanner!=null) scanner.close();                if(writer!=null)  writer.close();            }        }                 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("背包中物品的编号是:");            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("背包的总重量是:"+sumWeight);        }    }    

0 0