LeetCode DP篇-背包问题(416、518)
416. 分割等和子集
给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。
注意:
每个数组中的元素不会超过 100
数组的大小不会超过 200
示例 1:
输入: [1, 5, 11, 5]
输出: true
解释: 数组可以分割成 [1, 5, 5] 和 [11].
示例 2:
输入: [1, 2, 3, 5]
输出: false
解释: 数组不能分割成两个元素和相等的子集.
solution 1 二维数组
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
//和为奇数,不可能存在
if (sum%2 != 0) return false;
sum /= 2;
//默认为false
boolean[][] dp = new boolean[nums.length+1][sum+1];
//base case
for(int i = 0; i < nums.length+1; i++){
dp[i][0] = true;
}
//状态转移方程
for (int i = 1; i < nums.length+1; i++){
for (int j = 1; j < sum+1; j++){
//剩下空间装不下,不装入
if (j-nums[i-1] < 0){
dp[i][j] = dp[i-1][j];
}else{
//剩下空间可装入的情况下,装入后剩下为0,即为true
dp[i][j] = dp[i-1][j] || dp[i-1][j-nums[i-1]];
}
}
}
return dp[nums.length][sum];
}
}
//分成两个和相等的子集,等于找到和为总数和二分之一的数组,即0-1背包问题
solution2 一维数组
class Solution {
public boolean canPartition(int[] nums) {
int sum = 0;
for(int i = 0; i < nums.length; i++){
sum += nums[i];
}
//和为奇数,不可能存在
if (sum%2 != 0) return false;
sum /= 2;
//默认为false 每一次只依靠nums数组的前一个
boolean[] dp = new boolean[sum+1];
//base case
dp[0] = true;
//状态转移方程
for (int i = 0; i < nums.length; i++){
for (int j = sum; j >= 0; j--){
//剩下空间可装入时
if (j-nums[i] >= 0){
dp[j] = dp[j] || dp[j-nums[i]];
}
}
}
return dp[sum];
}
}
518. 零钱兑换 II
给定不同面额的硬币和一个总金额。写出函数来计算可以凑成总金额的硬币组合数。假设每一种面额的硬币有无限个。
示例 1:
输入: amount = 5, coins = [1, 2, 5]
输出: 4
解释: 有四种方式可以凑成总金额:
5=5
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1
示例 2:
输入: amount = 3, coins = [2]
输出: 0
解释: 只用面额2的硬币不能凑成总金额3。
示例 3:
输入: amount = 10, coins = [10]
输出: 1
注意:
你可以假设:
0 <= amount (总金额) <= 5000
1 <= coin (硬币面额) <= 5000
硬币种类不超过 500 种
结果符合 32 位符号整数
solution1 二维数组
class Solution {
public int change(int amount, int[] coins) {
int n = coins.length, m = amount;
if (amount == 0) return 1;
if(n == 1) {
if (coins[0] == amount) return 1;
if (coins[0] >= amount) return 0;
}
int[][] dp = new int[n+1][m+1];
//base case
for(int i = 0; i < n+1; i++){
dp[i][0] = 1;
}
for (int i = 1; i < n+1; i++){
for (int j = 1; j < m+1; j++){
//当前值等于不放入当前硬币金额达到amount的情况,和当入当前硬币金额达到的情况
if (j - coins[i-1] >= 0){
dp[i][j] = dp[i-1][j] + dp[i][j-coins[i-1]];
}else {
dp[i][j] = dp[i-1][j];
}
}
}
return dp[n][m];
}
}
//1.dp数组
//2.base case
//3.求状态转移方程(数学归纳法 或 根据实际情况推导,如背包问题分为放入和不放入两种情况)
solution 2 空间压缩
class Solution {
public int change(int amount, int[] coins) {
int n = coins.length, m = amount;
if (amount == 0) return 1;
if(n == 1) {
if (coins[0] == amount) return 1;
if (coins[0] >= amount) return 0;
}
int[] dp = new int[m+1];
//base case
dp[0] = 1;
for (int i = 0; i < n; i++){
for (int j = 1; j < m+1; j++){
//当前值等于不放入当前硬币金额达到amount的情况,和当入当前硬币金额达到的情况
if (j - coins[i] >= 0){
dp[j] = dp[j] + dp[j-coins[i]];
}else {
dp[j] = dp[j];
}
}
}
return dp[m];
}
}
LeetCode DP篇-背包问题(416、518)的更多相关文章
- 【dp】 背包问题
问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...
- dp小结|背包问题
1.先放上0-1背包模板 二维数组 for(int i=1;i<=n;i++)//枚举 物品 for(int j=1;j<=V;j++)//枚举体积 //这个位置是可以正序枚举的. qwq ...
- 动态规划(DP),0-1背包问题
题目链接:http://poj.org/problem?id=3624 1.p[i][j]表示,背包容量为j,从i,i+1,i+2,...,n的最优解. 2.递推公式 p[i][j]=max(p[i+ ...
- Codeforces Round #105 (Div. 2) E. Porcelain —— DP(背包问题)
题目链接:http://codeforces.com/problemset/problem/148/E E. Porcelain time limit per test 1 second memory ...
- 【leetcode dp】629. K Inverse Pairs Array
https://leetcode.com/problems/k-inverse-pairs-array/description/ [题意] 给定n和k,求正好有k个逆序对的长度为n的序列有多少个,0& ...
- 【leetcode dp】132. Palindrome Partitioning II
https://leetcode.com/problems/palindrome-partitioning-ii/description/ [题意] 给定一个字符串,求最少切割多少下,使得切割后的每个 ...
- 【leetcode dp】Dungeon Game
https://leetcode.com/problems/dungeon-game/description/ [题意] 给定m*n的地牢,王子初始位置在左上角,公主在右下角不动,王子要去救公主,每步 ...
- 「10.19」最长不下降子序列(DP)·完全背包问题(spfa优化DP)·最近公共祖先(线段树+DFS序)
我又被虐了... A. 最长不下降子序列 考场打的错解,成功调了两个半小时还是没A, 事实上和正解的思路很近了,只是没有想到直接将前$D$个及后$D$个直接提出来 确实当时思路有些紊乱,打的时候只是将 ...
- [LeetCode] Dp
Best Time to Buy and Sell Stock 题目: Say you have an array for which the ith element is the price of ...
- [Leetcode] DP -- Target Sum
You are given a list of non-negative integers, a1, a2, ..., an, and a target, S. Now you have 2 symb ...
随机推荐
- Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行
Solr Shiro Log4j2 命令执行--文件读取--反序列化--身份权限绕过--命令执行 solr 远程命令执行 (CVE-2019-17558) 漏洞简介 Apache Velocity是一 ...
- nginx中一个请求匹配到多个location时的优先级问题,马失前蹄了
背景 为什么讲这么小的一个问题呢?因为今天在进行系统上线的时候遇到了这个问题. 这次的上线动作还是比较大的,由于组织架构拆分,某个接入层服务需要在两个部门各自独立部署,以避免频繁的跨部门沟通,提升该接 ...
- 基于LangChain的LLM应用开发3——记忆
此情可待成追忆,只是当时已惘然.我们人类会有很多或美好或痛苦的回忆,有的回忆会渐渐模糊,有的回忆午夜梦醒,会浮上心头. 然而现在的大语言模型都是没有记忆的,都是无状态的,大语言模型自身不会记住和你对话 ...
- C# 在流行度指数上将超过Java
2023年10月最新的TIOBE编程语言流行指数表明:C#和Java之间的差距从未如此之小,目前,差异仅为1.2%,如果趋势保持这种状态,C#将在大约2个月内超过Java,TIOBE Software ...
- 解密长短时记忆网络(LSTM):从理论到PyTorch实战演示
本文深入探讨了长短时记忆网络(LSTM)的核心概念.结构与数学原理,对LSTM与GRU的差异进行了对比,并通过逻辑分析阐述了LSTM的工作原理.文章还详细演示了如何使用PyTorch构建和训练LSTM ...
- ResNet详解:网络结构解读与PyTorch实现教程
本文深入探讨了深度残差网络(ResNet)的核心概念和架构组成.我们从深度学习和梯度消失问题入手,逐一解析了残差块.初始卷积层.残差块组.全局平均池化和全连接层的作用和优点.文章还包含使用PyTorc ...
- 不同角度理解线程的状态(操作系统 & Java API)
3.12 五种状态 ( 操作系统 层面) 这是从 操作系统 层面来描述的 [初始状态]仅是在语言层面创建了线程对象,还未与操作系统线程关联 [可运行状态](就绪状态)指该线程已经被创建(与操作系统线程 ...
- JUC并发编程学习笔记(十七)彻底玩转单例模式
彻底玩转单例模式 单例中最重要的思想------->构造器私有! 恶汉式.懒汉式(DCL懒汉式!) 恶汉式 package single; //饿汉式单例(问题:因为一上来就把对象加载了,所以可 ...
- 四个id 生成器性能比较记录
IdGenerator Seata 优化的雪花算法 Seata基于改良版雪花算法的分布式UUID生成器分析 关于新版雪花算法的答疑 csharp 移植代码 public class IdGenerat ...
- 微服务系列-Spring Boot使用Open Feign 微服务通信示例
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 在前几个教程中我们已经看到: 使用 RestTemplate 的 Spring Boot 微服务通信示例 使用 We ...