0-1背包问题

该博客探讨了如何使用动态规划解决0-1背包问题,即在一个可装载重量为W的背包中,选择N个物品以最大化总价值。文章通过Java代码实现了一个动态规划算法,逐层遍历所有可能的选择,找到能放入背包的最大价值组合。动态规划的思想在于找出所有可能的装包方案并比较其价值,最终得到最优解。
摘要由CSDN通过智能技术生成

一个可装载重量为W的背包和N个物品,第i个物品重量wt[i],价值val[i] 求最多能装的价值

思想:动态规划,找出能装入背包的所有可能性,然后再找出最大价值的

1.每装一次一味着剩余能装的重量为:w - wt.get(n)

2.剩余选择物品的列表的开始则从i+1开始

3.找出最大价值的即可解出

/**
 * description:0-1 背包问题
 */
public class Big {
    static int N = 3;
    static int W = 4;
    static LinkedList<LinkedList<Integer>> integers = new LinkedList<>();

    public static void main(String[] args) {
        // 装载量为W的  N个物品  第i个物品重量  wt[i] 价值val[i]   求最大装入价值
        List<Integer> wt = Arrays.asList(2, 1, 3);
        List<Integer> val = Arrays.asList(4, 2, 3);
        LinkedList<Integer> list = new LinkedList<>();
        choose(W, 0, wt, list);
        System.out.println(Big.integers);
        int max = 0;
        for (LinkedList<Integer> integer : Big.integers) {
            int sum = integer.stream().mapToInt(o -> val.get(o)).sum();
            if (sum > max) {
                max = sum;
            }
        }
        System.out.println(max);
    }

    public static void choose(int w, int n, List<Integer> wt, LinkedList<Integer> tmp) {
        // 如果当前重量减去选择重量小于0则退出
        if (n >= N || w - wt.get(n) < 0) {
            integers.add(new LinkedList<>(tmp));
            return;
        }
        /**
         * 剩余重量
         */
        for (int i = n; i < N; i++) {
            if (w - wt.get(i) < 0) {
                continue;
            }
            tmp.add(i);
            choose(w - wt.get(i), i + 1, wt, tmp);
            tmp.removeLast();
        }
    }
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值