当前位置: 首页 > news >正文

代码随想录算法训练营第35天 | 01背包问题二维、01背包问题一维、416. 分割等和子集

一、01背包问题二维

二维数组,一维为物品,二维为背包重量

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int bag = scanner.nextInt();

        int[] weight = new int[n];
        int[] value = new int[n];

        for(int i=0; i<n ; i++){
            weight[i] = scanner.nextInt();
        }

        for(int j=0; j<n ; j++){
            value[j] = scanner.nextInt();
        }

        int[][] dp = new int[n][bag+1];

        for(int j=weight[0]; j<=bag ; j++){
            dp[0][j] = value[0];
        }

        for(int i = 1 ; i<n ; i++){
            for(int j=0; j<=bag ; 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[n - 1][bag]);
    }
}

二、01背包问题一维

在一维数组上更新,pd[j] 为容量为j的背包容纳的最大价值。

第一层循环是每个物品,第二层循环要从背包容量向前循环到当前物品重量,更新时判断【当前容量最大价值】和【放入当前物品后的总价值】的最高值。

import java.util.Scanner;

public class Main{
    public static void main(String[] args){
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        int bag = scanner.nextInt();

        int[] weight = new int[n];
        int[] value = new int[n];

        for(int i=0; i<n ; i++){
            weight[i] = scanner.nextInt();
        }

        for(int j=0; j<n ; j++){
            value[j] = scanner.nextInt();
        }

        int[] dp = new int [bag+1];

        for (int i = 0; i < n; i++) {
            for (int j = bag; j >=  weight[i]; j--) {
                dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
            }
        }

        System.out.println(dp[bag]);
    }
}

三、416. 分割等和子集

利用背包问题的思路,看能否装满sum/2的背包,物品的重量和价值一样都是元素的数值

class Solution {
    public boolean canPartition(int[] nums) {
        if(nums ==null || nums.length < 2) return false;
        int sum = 0;
        for(int num : nums){
            sum += num;
        }
        if(sum%2 == 1) return false;
        int target = sum/2;

        int[] dp = new int[target+1];

        for(int i = 0 ; i<nums.length; i++){
            for(int j = target ; j>=nums[i] ; j--){
                dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);
            }

            if(dp[target]==target) return true;
        }
        return dp[target]==target;
    }
}

相关文章:

  • 【芯片设计】处理器芯片大厂前端设计工程师面试记录·20250307
  • ClickHouse 中出现 DB::Exception: Too many parts 错误
  • 什么是向量数据库?向量数据库概念,详细入门
  • 【五.LangChain技术与应用】【26.LangChain Agent基础应用(上):智能代理的构建】
  • 护照阅读器在机场流程中的应用
  • MATLAB中lookAheadBoundary函数用法
  • TWind 的黑马点评随笔
  • Android15请求动态申请存储权限完整示例
  • meta|BioMercator:整合遗传图谱和 QTL 以发现候选基因
  • 【五.LangChain技术与应用】【28.LangChain Agent添加记忆:智能代理的长期学习能力】
  • Java基础知识大全(含答案,面试基础)
  • Facebook 的隐私保护数据存储方案研究
  • 物联网IoT系列之MQTT协议基础知识
  • 机器学习(六)
  • c#实现Modbus TCP/IP与RS 485数据交换的实例
  • 项目复盘-浏览器插件
  • 微服务拆分-拆分商品服务
  • 深入剖析Java代理模式:静态代理与动态代理的实战应用
  • Java中的 json文件
  • 【DeepSeek问答】访问QStandardItemModel::index(r,c)获取的空索引导致程序崩溃
  • 金融网站建设方案ppt模板/怎么在百度制作自己的网站
  • wordpress域名资源地址/天津抖音seo
  • 做淘客网站去哪里购买空间/如何开网站详细步骤
  • 软件开发流程包括/seo关键词优化经验技巧
  • 免费在线响应式网站自助建站/网络营销典型案例
  • 网站域名解析到了空间 但空间未绑定此域名/网络营销是什么?