zoukankan      html  css  js  c++  java
  • 0 1背包问题之leetcode总结

    直接上代码吧,可以递归解决也可以非递归解决。

    import java.util.LinkedList;
    
    public class Main{
        /*
          由dp[i - 1][j]推出,即背包容量为j,里面不放物品i的最大价值,此时dp[i][j]就是dp[i - 1][j]
          由dp[i - 1][j - weight[i]]推出,dp[i - 1][j - weight[i]] 为背包容量为j - weight[i]的时候不放物品i的最大价值,
          那么dp[i - 1][j - weight[i]] + value[i] (物品i的价值),就是背包放物品i得到的最大价值
         */
        static void test_2_wei_bag_problem1() {
            int[] weight = {1, 3, 4};
            int[] value = {15, 20, 30};
            int bagWeight = 4;//包的容量
    
            bagWeight = 6;//包的容量
            weight=new int[]{1,2,3,4,5};
            value=new  int[]{2,4,4,5,6};
    
            bagWeight = 100;//包的容量
            weight=new int[]{77,22,29,50,99};
            value=new  int[]{92,22,87,46,90};
    
    
            // 二维数组
            int[][] dp = new int[weight.length][bagWeight + 1];
            // 初始化
            //初始化第一列 weight[0]
            for (int i = 1; i < dp[0].length; i++) {
                if (i >= weight[0]) {
                    dp[0][i] = value[0];
                }
            }
            //容量为0
            for (int i = 0; i < dp.length; i++) {
                dp[i][0] = 0;
            }
            // weight数组的大小 就是物品个数
            for (int i = 1; i < weight.length; i++) { // 遍历物品
                for (int j = 1; j <= bagWeight; j++) { // 遍历背包容量
                    if (j < weight[i]) dp[i][j] = dp[i - 1][j];
                    else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);
    
                }
            }
            System.out.println(dp[weight.length - 1][bagWeight]);
        }
    
        public static void test_2_wei_bag_problem0() {
            int[] weight = {1, 3, 4};
            int[] value = {15, 20, 30};
            int bagWeight = 6;//包的容量
    
            bagWeight = 6;
            weight=new int[]{1,2,3,4,5};
            value=new  int[]{2,4,4,5,6};
    
            bagWeight = 100;//包的容量
            weight=new int[]{77,22,29,50,99};
            value=new  int[]{92,22,87,46,90};
            helper(weight,value,bagWeight,0);
            System.out.println(sum);
        }
    
        public static LinkedList<Integer> list = new LinkedList<>();
        public static int sum = 0;
    
        public static void helper(int[] weight, int[] value, int bagWeight, int index) {
            if (index >= weight.length)
                return;
            if (bagWeight >= 0) {
                int cnt = 0;
                for (Integer i :
                        list) {
                    cnt+=i;
                }
                sum=Math.max(sum,cnt);
            }
    
            list.add(value[index]);
            helper(weight, value, bagWeight - weight[index], index + 1);
            list.pollLast();
            helper(weight, value, bagWeight, index + 1);
    
        }
    
        public static void main(String[] args) {
            test_2_wei_bag_problem1();
            test_2_wei_bag_problem0();
        }
    }
    

      

    加油啦!加油鸭,冲鸭!!!
  • 相关阅读:
    Kubernetes对象之Pod
    docker&k8s填坑记
    kubernetes安装过程中遇到问题及解决
    深入JVM-垃圾回收概念与算法
    深入JVM-常用Java虚拟机参数
    深入JVM-java虚拟机的基本结构
    从Paxos到ZooKeeper-三、ZooKeeper的典型应用场景
    从Paxos到ZooKeeper-二、ZooKeeper和Paxos
    从Paxos到ZooKeeper-一、分布式架构
    java编程思想-java中的并发(四)
  • 原文地址:https://www.cnblogs.com/clarencezzh/p/15059064.html
Copyright © 2011-2022 走看看