揹包問題(第七週作業)

package org.jrue;  
  
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="src/Knapsack.txt";    
        String resultPath="src/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);    
    }    
}

結果截圖爲:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章