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 ...
随机推荐
- Jellyfin Documentation
Skip to main content Introduction On this page Welcome to the Jellyfin Documentation Jellyfin is ...
- 使用 Helm 管理应用的一些 Tips
背景 Helm 是一个 Kubernetes 的包管理工具,有点类似于 Mac 上的 brew,Python 中的 PIP:可以很方便的帮我们直接在 kubernetes 中安装某个应用. 比如我们可 ...
- gitlab ci 用 cypress/playwright 做测试并展示结果至 mr
前言 看了一下官方的教程好像都没有讲怎么将测试结果展示出来,只是给出测试的 ci 脚本,但根据 gitlab 官方的文档是有测试报告的展示的,所以这里给出一个基于 junit 测试报告的展示. 前期准 ...
- 数字时代的自我呈现:探索个人形象打造的创新工具——FaceChain深度学习模型工具
数字时代的自我呈现:探索个人形象打造的创新工具--FaceChain深度学习模型工具 1.介绍 FaceChain是一个可以用来打造个人数字形象的深度学习模型工具.用户仅需要提供最低一张照片即可获得独 ...
- Pushpin:开源即时通信神器,让你的API秒变实时API,轻松实现WebSocket,HTTP流和HTTP长轮询等服务
作为一个开发者,你可能已经利用过REST API来构建和集成各种应用.REST API是基于HTTP协议的交互模式,它使得客户端和服务器可以通过请求和响应来进行数据交换,简单.灵活.通用. 然而,当你 ...
- 如何使用markdown
关于如何使用markdown写博客 markdown的语法 代码的插入 电脑Table建上面上面的键输入三个点``` 然后输入语言+回车 c语言中第一个程序 #include<stdio.h&g ...
- ResNet详解:网络结构解读与PyTorch实现教程
本文深入探讨了深度残差网络(ResNet)的核心概念和架构组成.我们从深度学习和梯度消失问题入手,逐一解析了残差块.初始卷积层.残差块组.全局平均池化和全连接层的作用和优点.文章还包含使用PyTorc ...
- 二。docker安装mysql 并配置
1.docker安装mysql 1.1使用docker拉取mysql的镜像 docker pull mysql:5.7 1.2通过镜像启动 docker run -p 3306:3306 --name ...
- 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录
前言 RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理. 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验. 特点 成熟,稳定 消息持久 ...
- HTML DOM之二:事件
对事件作出反应 当事件发生时,可以执行 JavaScript,比如当用户点击一个 HTML 元素时. 如需在用户点击某个元素时执行代码,请把 JavaScript 代码添加到 HTML 事件属性中: ...