day 41 动归 04

 01背包问题 二维 
dp[i][j] 表示在物品i时,背包在j容量下的最大价值,递推公式为

dp[i][j] = Math.max(dp[i-1][j] , dp[i-1][j-weight[i]] + value[i]);

第一个时不放物品i,其价值等于在物品i-1时背包在j容量下的最大价值,第二个是放物品i,表示是在i-1物品时,背包在j-weight[i]时的价值加上i物品的价值。

public class BagProblem {
    public static void main(String[] args) {
        int[] weight = {1,3,4};
        int[] value = {15,20,30};
        int bagSize = 4;
        testWeightBagProblem(weight,value,bagSize);
    }
    public static void testWeightBagProblem(int[] weight, int[] value, int bagSize){
        int goods = weight.length;
        int[][] dp = new int[goods][bagSize + 1];
        for (int j = weight[0]; j <= bagSize; j++) {
            dp[0][j] = value[0];
        }
        for (int i = 1; i < weight.length; i++) {
            for (int j = 1; j <= bagSize; 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]);
                }
            }
        }
        for (int i = 0; i < goods; i++) {
            for (int j = 0; j <= bagSize; j++) {
                System.out.print(dp[i][j] + "\t");
            }
            System.out.println("\n");
        }
    }
}

 01背包问题 一维 

    public static void main(String[] args) {
        int[] weight = {1, 3, 4};
        int[] value = {15, 20, 30};
        int bagWight = 4;
        testWeightBagProblem(weight, value, bagWight);
    }

    public static void testWeightBagProblem(int[] weight, int[] value, int bagWeight){
        int wLen = weight.length;
        //定义dp数组:dp[j]表示背包容量为j时,能获得的最大价值
        int[] dp = new int[bagWeight + 1];
        //遍历顺序:先遍历物品,再遍历背包容量
        for (int i = 0; i < wLen; i++){
            for (int j = bagWeight; j >= weight[i]; j--){
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }
        //打印dp数组
        for (int j = 0; j <= bagWeight; j++){
            System.out.print(dp[j] + " ");
        }
    }

 416. 分割等和子集  

题目链接:416. 分割等和子集 - 力扣(LeetCode)

思路;物品是nums[i],重量是nums[i],价值也是nums[i],背包体积是sum/2。

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums == null || nums.length == 0) return false;
        int n = nums.length;
        int sum = 0;
        for(int num : nums) {
            sum += num;
        }
        //总和为奇数,不能平分
        if(sum % 2 != 0) return false;
        int target = sum / 2;
        int[] dp = new int[target + 1];
        for(int i = 0; i < n; i++) {
            for(int j = target; j >= nums[i]; j--) {
                //物品 i 的重量是 nums[i],其价值也是 nums[i]
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }
           
            //剪枝一下,每一次完成內層的for-loop,立即檢查是否dp[target] == target,優化時間複雜度(26ms -> 20ms)
            if(dp[target] == target)
                return true;
        }
        return dp[target] == target;
    }
}

相关推荐

  1. day 41 04

    2024-03-29 16:54:02       19 阅读
  2. <span style='color:red;'>Day</span><span style='color:red;'>41</span>

    Day41

    2024-03-29 16:54:02      6 阅读
  3. Day41| 416 分割等和子集

    2024-03-29 16:54:02       20 阅读
  4. LEETCODE-DAY41

    2024-03-29 16:54:02       15 阅读
  5. Day41 HTTP编程

    2024-03-29 16:54:02       11 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-03-29 16:54:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-03-29 16:54:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-03-29 16:54:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-03-29 16:54:02       20 阅读

热门阅读

  1. RocketMq总结

    2024-03-29 16:54:02       17 阅读
  2. Sql中如何添加数据

    2024-03-29 16:54:02       20 阅读
  3. Python获取当前服务器的公网IP

    2024-03-29 16:54:02       20 阅读
  4. 【[蓝桥杯 2013 省 B] 带分数】

    2024-03-29 16:54:02       18 阅读