第7周作业--背包问题

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);      
    }      
}      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值