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

来源:互联网 发布:java标准字符串转日期 编辑:程序博客网 时间:2024/06/06 10:54
import java.io.File;  import java.io.PrintWriter;  import java.util.Scanner;    public class Knapsack {      static String path="E:/Knapsack.txt";        static String resultPath="E:/KnapsackResult.txt";        private int[] v;//存储物品的价值        private int[] w;//存储物品的重量         private int allWeight;//背包容纳重量        private int allNum;//物品数量        private int MValue[][];//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.MValue=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[][] getMValue() {            return MValue;        }        public void setMValue(int[][] fValue) {            this.MValue = MValue;        }              public static void main(String[] args) {            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[][] Mvalue=kna.getMValue();                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++){                    Mvalue[i][0]=0;                }                for(i=1;i<=allWeight;i++){                    Mvalue[0][i]=0;                }                for(i=1;i<=allNum;i++){                    for(int j=1;j<=allWeight;j++){                        if(j<w[i-1]){                            Mvalue[i][j]=Mvalue[i-1][j];                        }else{                            Mvalue[i][j]=Math.max(Mvalue[i-1][j], Mvalue[i-1][j-w[i-1]]+v[i-1]);                        }                    }                }                                System.out.println("背包中物品的最大价值是:"+Mvalue[allNum][allWeight]);                kna.traceBack(v, w, Mvalue, allWeight, allNum);//求出物品编号和背包总重量                System.out.println("构造的二维表格输出结果:");                for(i=1;i<=allNum;i++){//输出二维数组到文本文件KnapsackResult.txt中                    for(int j=1;j<=allWeight;j++){                        System.out.print(Mvalue[i][j]+" ");                        writer.print(Mvalue[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[][] Mvalue,int allWeight,int allNum){            int wupinNo[]=new int[allNum+1];            int j=allWeight;            for(int i=allNum;i>0;i--){                if(Mvalue[i][j]>Mvalue[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);        }    }    

二维表格文件KnapsackResult.txt下载地址http://download.csdn.net/download/u010917502/7260037

0 0
原创粉丝点击