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

代码随想录算法训练营Day35|动态规划Part03|01背包问题 二维、01背包问题 一维、416. 分割等和子集

01背包问题 二维(关键)

代码随想录

视频讲解:带你学透0-1背包问题!| 关于背包问题,你不清楚的地方,这里都讲了!| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili

背包最大重量为4。

物品为:

重量价值
物品0115
物品1320
物品2430

问背包能背的物品最大价值是多少?

public class Bag {public static void main(String[] args) {int[] weights = {1,3,4};int[] values = {15,20,30};int[][] dp = new int[3][5];for(int i=0;i<3;i++){dp[i][0] = 0;}for(int j=0;j<5;j++){dp[0][j] = j>=weights[0] ? values[0]:0;}for(int m=1;m<3;m++){for(int n=1;n<5;n++){if(n>=weights[m]){dp[m][n] = Math.max(dp[m-1][n], dp[m-1][n-weights[m]]+values[m]);}else{dp[m][n] = dp[m-1][n];}}}printdp(dp);}public static void printdp(int[][] dp){int row = dp.length;int column = dp[0].length;for(int i=0;i<row;i++){for(int j=0;j<column;j++){System.out.print(dp[i][j]);System.out.print(' ');}System.out.println();}}
}

01背包问题 一维(关键)

代码随想录

视频讲解:带你学透01背包问题(滚动数组篇) | 从此对背包问题不再迷茫!_哔哩哔哩_bilibili

public class Bag {public static void main(String[] args) {int[] weights = {1,3,4};int[] values = {15,20,30};int[] dp = new int[5];for(int i=0;i<3;i++){for(int j=4;j>=weights[i];j--){dp[j] = Math.max(dp[j], dp[j-weights[i]]+values[i]);}}printdp(dp);}public static void printdp(int[] dp){int column = dp.length;for(int j=0;j<column;j++){System.out.print(dp[j]);System.out.print(' ');}System.out.println();}
}

416. 分割等和子集(关键)

代码随想录

视频讲解:动态规划之背包问题,这个包能装满吗?| LeetCode:416.分割等和子集_哔哩哔哩_bilibili

给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。

注意: 每个数组中的元素不会超过 100 数组的大小不会超过 200

示例 1:

  • 输入: [1, 5, 11, 5]
  • 输出: true
  • 解释: 数组可以分割成 [1, 5, 5] 和 [11].

示例 2:

  • 输入: [1, 2, 3, 5]
  • 输出: false
  • 解释: 数组不能分割成两个元素和相等的子集.

提示:

  • 1 <= nums.length <= 200
  • 1 <= nums[i] <= 100

思路

错误写法:左右指针遍历直到相邻,判断左侧和与右侧和是否相等。(1,1,2,2)是一个反例,和不一定非要从一侧取。

import java.util.Arrays;class Solution {public boolean canPartition(int[] nums) {Arrays.sort(nums);int left = 0;int right = nums.length-1;if(left == right) return false;int sumleft = nums[left];int sumright = nums[right];while(left<right-1){if(sumleft<=sumright) sumleft+=nums[++left];else if(sumleft>sumright) sumright+=nums[--right];}return sumleft==sumright ? true:false;}
}
class Solution {public boolean canPartition(int[] nums) {//using 2-D DP array.int len = nums.length;//check edge cases;if(len == 0)return false;int sum = 0;for (int num : nums)sum += num;//we only deal with even numbers. If sum is odd, return false;if(sum % 2 == 1)return false;int target = sum / 2;int[][] dp = new int[nums.length][target + 1];// for(int j = 0; j <= target; j++){//     if(j < nums[0])//         dp[0][j] = 0;//     else//         dp[0][j] = nums[0];// }//initialize dp arrayfor(int j = nums[0]; j <= target; j++){dp[0][j] = nums[0];}for(int i = 1; i < len; i++){for(int j = 0; j <= target; j++){if (j < nums[i]) dp[i][j] = dp[i - 1][j];else dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - nums[i]] + nums[i]);}}//print out DP array// for(int x : dp){//     System.out.print(x + ",");// }// System.out.print("    "+i+" row"+"\n");return dp[len - 1][target] == target;}
}

 

http://www.dtcms.com/a/292047.html

相关文章:

  • (12)机器学习小白入门YOLOv:YOLOv8-cls 模型微调实操
  • YOLO-实例分割头
  • 解决http下浏览器无法开启麦克风问题
  • 【论文阅读 | TIV 2024 | CDC-YOLOFusion:利用跨尺度动态卷积融合实现可见光-红外目标检测】
  • Python实例之画小猪佩奇
  • 知识库搭建之Meilisearch‘s 搜索引擎 测评-东方仙盟测评师
  • Agent架构与工作原理:理解智能体的核心机制
  • Apache Ignite 中 WHERE 子句中的子查询(Subqueries in WHERE Clause)的执行方式
  • 社交电商推客系统全栈开发指南:SpringCloud+分润算法+Flutter跨端
  • 深入浅出控制反转与依赖注入:从理论到实践
  • 深度学习的一些疑点整理
  • J2EE模式---拦截过滤器模式
  • 操作系统 —— A / 概述
  • 工业通信网关详解:2025年技术选型与物联网方案设计指南
  • 激活函数Focal Loss 详解​
  • Jenkins流水线中的核心概念
  • DearMom以“新生儿安全系统”重塑婴儿车价值,揽获CBME双项大奖
  • STM32 GPIO(通用输入输出)详解:从模式原理到实战应用
  • C++_Hello算法_队列
  • Word2Vec和Doc2Vec学习笔记
  • 用手机当外挂-图文并茂做报告纪要
  • AWS PrivateLink方式访问Redis
  • Windows游戏自动检测本地是否安装 (C++版)
  • 设计模式七:抽象工厂模式(Abstract Factory Pattern)
  • 技能系统详解(4)——运动表现
  • 面向对象高级:static
  • linux内核与GNU之间的联系和区别
  • 决策规划内容整理
  • Linux的磁盘存储管理实操——(下一)——标准分区扩容
  • 得物视觉算法面试30问全景精解