蛮力法解决01背包问题

import java.util.*;

public class Solution {
    static List<Integer> list = new ArrayList<>();
    static List<String> resStr = new ArrayList<>();
    static int indexRes = 0;
    static int val = 0;
    static int we = 0;
    public static void main(String[] args) {
        int c = 15;
        int[] w = new int[]{2,12,1,1,4};
        int[] v = new int[]{2,4,2,1,10};
        QGY(w,v,c);
        System.out.println("可能种类:"+list.size());
        System.out.println("总价值最高为:"+list.stream().max(((o1, o2) -> o1-o2)).get());
        System.out.println("重量为:"+we);
        System.out.println("组合为:"+resStr.get(indexRes)+";是第"+indexRes+"种");
    }
    public static void QGY(int[] w,int[] v,int c){
        Bag bag = new Bag(w.length);
        qgy(w,v,c,bag,0);
    }

    public static void qgy(int[] w,int[] v,int c,Bag bag,int index){
        if(index == bag.thingNum){
            int temp = list.size();
            list.add(bag.sum);
            resStr.add(bag.toString());
            if(val<bag.sum){
                val = bag.sum;
                we = bag.w;
                indexRes = temp;
            }
            System.out.println(bag);
            return;
        }
        Bag bag0 = new Bag(bag.thingNum);
        bag0.setSum(bag.sum);
        bag0.setMap(bag.map);
        bag0.w = bag.w;
        qgy(w,v,c,bag0,index+1);
        Bag bag1 = new Bag(bag.thingNum);
        bag1.setSum(bag.getSum());
        bag1.setMap(bag.map);
        bag1.w = bag.w;
        if(c>=w[index]){
            c -= w[index];
            bag1.map.put(index,1);
            bag1.setSum(bag1.getSum()+v[index]);
            bag1.w += w[index];
        }else {
            System.out.print("背包空间不足");
        }
        qgy(w,v,c,bag1,index+1);
        bag1.map.put(index,0);
        bag1.w -= w[index];
    }
}

class Bag{
    Map<Integer,Integer> map;  //背包装的东西
    int sum;
    int w;
    int thingNum;

    public Bag(int length){
        map = new TreeMap<>(new Comparator<Integer>() {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1 - o2;
            }
        });
        for(int i = 0;i < length;i++){
            map.put(i,0);
        }
        thingNum = length;
        sum = 0;
        w = 0;
    }

    public Map<Integer, Integer> getMap() {
        return map;
    }

    public void setMap(Map<Integer, Integer> map) {
        this.map = map;
    }

    public int getSum() {
        return sum;
    }

    public void setSum(int sum) {
        this.sum = sum;
    }

    @Override
    public String toString() {
        Set<Integer> integers = map.keySet();
        String res = "{";
        for(int i = 0;i < integers.size();i++){
            res += "" + this.map.get(i).toString() + ",";
        }
        res = res.substring(0,res.length()-1) + "}";

        return res + "总价值:" + sum + ";总重量:" + w;
    }
}
  • 8
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值