第七周作业——背包问题

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



package Backpack;
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 static void main(String[] args) {  
	        String path="E:/Knapsack.txt";  
	        String resultPath="E:/KnapsackResult.txt";  
	        Scanner sc=null;  
	        PrintWriter writer=null;  
	        try {  
	            sc=new Scanner(new File(path));  
	            writer=new PrintWriter(new File(resultPath));  
	            int allWeight=sc.nextInt();//背包总重量  
	            int allNum=sc.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]=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);//求出物品编号和背包总重量  
	        } catch (Exception e) {  
	            // TODO Auto-generated catch block  
	            e.printStackTrace();  
	        }finally{  
	            if(sc!=null) sc.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.print("最终背包中物品的编号是:");  
	        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);  
	    }  

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值