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)的更多相关文章

  1. 【dp】 背包问题

    问题一:01背包 题目: [题目描述] 一个旅行者有一个最多能装 M 公斤的背包,现在有 n件物品,它们的重量分别是W1,W2,...,Wn它们的价值分别为C1,C2,...,Cn求旅行者能获得最大总 ...

  2. dp小结|背包问题

    1.先放上0-1背包模板 二维数组 for(int i=1;i<=n;i++)//枚举 物品 for(int j=1;j<=V;j++)//枚举体积 //这个位置是可以正序枚举的. qwq ...

  3. 动态规划(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+ ...

  4. Codeforces Round #105 (Div. 2) E. Porcelain —— DP(背包问题)

    题目链接:http://codeforces.com/problemset/problem/148/E E. Porcelain time limit per test 1 second memory ...

  5. 【leetcode dp】629. K Inverse Pairs Array

    https://leetcode.com/problems/k-inverse-pairs-array/description/ [题意] 给定n和k,求正好有k个逆序对的长度为n的序列有多少个,0& ...

  6. 【leetcode dp】132. Palindrome Partitioning II

    https://leetcode.com/problems/palindrome-partitioning-ii/description/ [题意] 给定一个字符串,求最少切割多少下,使得切割后的每个 ...

  7. 【leetcode dp】Dungeon Game

    https://leetcode.com/problems/dungeon-game/description/ [题意] 给定m*n的地牢,王子初始位置在左上角,公主在右下角不动,王子要去救公主,每步 ...

  8. 「10.19」最长不下降子序列(DP)·完全背包问题(spfa优化DP)·最近公共祖先(线段树+DFS序)

    我又被虐了... A. 最长不下降子序列 考场打的错解,成功调了两个半小时还是没A, 事实上和正解的思路很近了,只是没有想到直接将前$D$个及后$D$个直接提出来 确实当时思路有些紊乱,打的时候只是将 ...

  9. [LeetCode] Dp

    Best Time to Buy and Sell Stock 题目: Say you have an array for which the ith element is the price of ...

  10. [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 ...

随机推荐

  1. 单元测验4:人格知识大比武2mooc

    单元测验4:人格知识大比武2 返回 本次得分为:10.00/10.00, 本次测试的提交时间为:2020-09-06, 如果你认为本次测试成绩不理想,你可以选择 再做一次 . 1 单选(2分) 关于M ...

  2. 创业团队建设与管理mooc【第二次中期测验】

    mo'o 第二次中期测验 返回 已经超过规定的测试次数或提交截止时间已过.你可以作为自我学习进行测验,但提交的结果将无法获得学分. 1 单选(2分) PDCA循环中的P是指什么? 得分/总分 A. 处 ...

  3. 通过unittest加载测试用例的不同方法

    使用python+unitest做自动化测试执行时, 执行用例时就涉及测试用例的加载. 即如何把测试cases加载到测试suite,然后进行运行. 一般把用例加载方法分为两大类:通过unittest. ...

  4. frida动态插桩初探

    前言 近期碰到了分析app的需求,就学习了一下 frida的动态插桩技术.frida是一款轻量级HOOK框架,可用于多平台上,例如android.windows.ios等.frida分为两部分,服务端 ...

  5. Centos7下创建centos-home逻辑分区

    1备份要挂载的文件夹 查看home文件夹有无文件,如有文件一定要记得备份 2创建逻辑分区 2.1查看已有逻辑分区 2.2查看磁盘分区情况 2.3查看磁盘PV 2.4创建逻辑分区 lvcreate -n ...

  6. oracle命令7 -rman命令

    $ rman targer /RMAN> show all; #查看rman中所有的配置RMAN configuration parameters for database with db_un ...

  7. 安信可开发环境构建-基于Ai-WB2系列 和 Ai-M61 或 Ai-M62 (环境上下文切换)

    首先,对于Ai-WB2系列环境的构建官方文档已经讲的非常明白了,这里不做阐述如下链接所示https://blog.csdn.net/Boantong_/article/details/12848091 ...

  8. TOBO

    然而并不会做. 最后就照着题解码了一遍/kk 真的好长啊.看时间就知道写了多久... upd in 2022: 我现在已经找不到原题面是什么了( 不过感觉把这样一篇不算题解的东西放进"题解& ...

  9. 『STAOI』G - Round 2 半个游记

    很刺激. 2023.3.2 23:17 第一次过审. 2023.3.5 00:02 第一次打回. 原因是背锅人的链接又双叒叕挂错了((( 2023.3.6 21:20 第二次过审. 2023.3.8 ...

  10. 数据类型python

    type()语句的用法 运行结果