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

来源:互联网 发布:邓肯所有季后赛数据 编辑:程序博客网 时间:2024/05/29 07:17

(1)背包问题。对上文中提到的背包问题提供的表1(数据文件下载Knapsack.txt,第一行为背包总重量15,物品数量5;第2-6行,分别为第1-5件物品的重量与价值),W=15,编程计算最终背包所装物品的编号、总重量与总价值。要求能够把构造的二维表格输出到文件KnapsackResult.txt中。

package bagquestion;import java.io.File;import java.io.FileNotFoundException;import java.io.PrintWriter;import java.util.Scanner;public class bag {private int[] v;//存储物品的价值private int[] w;//存储物品的重量 private int allWeight;//背包容纳重量private int allNum;//物品数量private int fValue[][];//fValue[i][j]存储前i个物品的重量为j的最大价值public bag(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)  throws FileNotFoundException{// TODO Auto-generated method stubScanner sc = new Scanner(new File("src/Knapsack.txt"));PrintWriter pw = new PrintWriter(new File("src/Knapsack.txt"));int allWeight=sc.nextInt();//背包总重量int allNum=sc.nextInt();//物品数量bag kna= new bag(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]=sc.nextInt();v[i-1]=sc.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]+" ");pw.print(fvalue[i][j]+" ");}System.out.println();pw.println();pw.close();sc.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
原创粉丝点击