Java经典算法——窃贼问题

来源:互联网 发布:王健林 鲁豫 知乎 编辑:程序博客网 时间:2024/05/21 18:46

题目:

有一个窃贼带着一背包去偷东西,屋中有5件物品,其重量和价值如下,

物品1:6公斤,48元

物品2:5公斤,40元

物品3:2公斤,12元

物品4:1公斤,8元

物品5:1公斤,7元

背包最多装8公斤,如何拿能达到最大价值?


import java.util.Scanner;//Thing类型结构,属性有总量,价值,是否被选择class Thing {    public double weight;    public double value;    public boolean isSelect;}public class QZWT {    private static double maxWt;    private static double maxValue;    private static int num;    private static Thing[] things;    private static boolean[] seltTemp;//临时数组,用来暂时记录各个物品是否被选择    public static void main(String[] args) {        Scanner sc = new Scanner(System.in);        System.out.print("背包承受最大重量为:");        maxWt = sc.nextDouble();        System.out.print("可选物品数量:");        num = sc.nextInt();        things = new Thing[num];        seltTemp = new boolean[num];        //将各个物品的各种信息填装进things数组中        for (int i = 0; i < num; i++) {            System.out.print("请输入第" + (i + 1) + "号物品的重量和价值:");            Thing t = new Thing();            t.weight = sc.nextDouble();            t.value = sc.nextDouble();            things[i] = t;        }        //信息核对        System.out.println("\n背包承受最大重量为" + maxWt);        for (int i = 0; i < things.length; i++) {            System.out.println("第" + (i + 1) + "号物品的重量:" + things[i].weight + ",价值:" + things[i].value);            seltTemp[i] = false;        }        maxValue = 0;//初始化已选的最大价值        //调用方法解决问题,第一传入数组things的地址,第二传入开始处理的物品的编号,第三传入已选物品总重量,第四传入已选物品总价值        handleBackpack(things, 0, 0.0, 0);        System.out.println("\n将以下物品装入背包:");        double sumWt=0;        for (int i = 0; i < num; i++) {            if (things[i].isSelect) {                System.out.println("物品" + (i + 1) + ",重量:" + things[i].weight + ",价值:" + things[i].value);                sumWt+=things[i].weight;            }        }        System.out.println("总重量为:" + sumWt + ",总价值为:" + maxValue);        sc.close();    }    private static void handleBackpack(Thing[] things, int i, double wt, double va) {        //判断,若加进此物品是否超重        if (wt + things[i].weight <= maxWt) {            seltTemp[i] = true;//加入选择            //判断是否为最后一个物品            if (i != num - 1) {                //处理下一个物品                handleBackpack(things, i + 1, wt + things[i].weight, va + things[i].value);            } else {                //判断现已选中的物品的价值是否大于之前所设定的最大价值                if (va +things[i].value> maxValue) {                    //各物品isSelect属性填充                    for (int j = 0; j < num; j++) {                        things[j].isSelect = seltTemp[j];                    }                    //将现已选中的物品的价值设为最大价值                    maxValue = va +things[i].value;                }            }        }        //将此物品取出        seltTemp[i] = false;        //判断是否为最后一个物品        if (i != num - 1) {            //处理下一个物品            handleBackpack(things, i + 1, wt, va);        } else {            //判断现已选中的物品的价值是否大于之前所设定的最大价值            if (va > maxValue) {                //各物品isSelect属性填充                for (int j = 0; j < num; j++) {                    things[j].isSelect = seltTemp[j];                }                //将现已选中的物品的价值设为最大价值                maxValue = va;            }        }    }}


0 0