第七周作业——背包问题

import java.io.*;  
import java.util.Scanner;  
  
public class Aa {  
 
    private int[] v;//存储物品的价值   
    private int[] w;//存储物品的重量    
    private int weight;//背包容纳重量   
    private int num;//物品数量   
    private int fValue[][];//fValue[i][j]存储前i个物品的重量为j的最大价值   
    public Aa(int weight,int num){  
        this.num=num;  
        this.weight=weight;  
        this.v=new int[num];  
        this.w=new int[num];  
        this.fValue=new int[num+1][weight+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="F://Knapsack.txt";  
        String resultPath="F://KnapsackResult.txt";  
        Scanner in=null;  
        PrintWriter writer=null;  
        try {  
            in=new Scanner(new File(path));  
            writer=new PrintWriter(new File(resultPath));  
            int weight=in.nextInt();//背包总重量   
            int num=in.nextInt();//物品数量   
            Aa aa= new Aa(weight,num);//初始化背包   
            int[] v=aa.getV();  
            int[] w=aa.getW();  
            int[][] fvalue=aa.getfValue();  
            int i=1;  
            for(i=1;i<=num;i++){//初始化物品价值数组和重量数组   
                 w[i-1]=in.nextInt();  
                 v[i-1]=in.nextInt();  
            }  
            for(i=1;i<=weight;i++){  
                fvalue[0][i]=0;  
            }  
            for(i=1;i<=num;i++){  
                fvalue[i][0]=0;  
            }  
            for(i=1;i<=num;i++){  
                for(int j=1;j<=weight;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[num][weight]);  
            aa.back(v, w, fvalue, weight, num);//求出物品编号和背包总重量   
            System.out.println("构造的二维表格输出结果:");  
            for(i=1;i<=num;i++){
                for(int j=1;j<=weight;j++){  
                    System.out.print(fvalue[i][j]+" ");  
                    writer.print(fvalue[i][j]+" ");  
                }  
                System.out.println();  
                writer.println();  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }finally{  
            if(in!=null) in.close();  
            if(writer!=null)  writer.close();  
        }  
    }     
 
    public void back(int[] v,int[] w,int[][] fvalue,int weight,int num){  
        int wupinNo[]=new int[num+1];  
        int j=weight;  
        for(int i=num;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<=num;i++){  
            if(wupinNo[i]==1){  
                System.out.print(i+" ");  
                sumWeight+=w[i-1];  
            }  
        }  
        System.out.println();  
        System.out.println("背包的总重量是:"+sumWeight);  
    }  
}  

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值