
背包问题
文章平均质量分 52
背包问题分类总结
algsup
这个作者很懒,什么都没留下…
展开
-
[线性dp]leetcode2327:知道秘密的人数(medium)
题目:题解:代码如下:原创 2022-07-05 14:06:59 · 330 阅读 · 0 评论 -
[01背包]leetcode115:不同的子序列(hard)
题目:题解:代码如下:原创 2022-06-07 16:46:16 · 147 阅读 · 0 评论 -
[完全背包]leetcode2240:买钢笔和铅笔的方案数(medium)
题目:题解:代码如下:using LL = long long;class Solution {public: long long waysToBuyPensPencils(int n, int c1, int c2) { return dp2(n,c1,c2); } LL dp2(int n,int c1,int c2) { vector<LL> f(n+1,1); for(int v:{c1,原创 2022-05-28 08:21:39 · 192 阅读 · 0 评论 -
[01背包]leetcode474:一和零(medium)
题目:题解:本题只不过是在一个物品里面限定了2个体积,所以我们仅需维护两个背包体积即可,剩下的思路等同朴素版 01 背包。代码如下:int f[610][110][110];int f2[110][110];class Solution {public: // 两个维度的01背包,限制0的个数最多为m个,限制1的个数最多为n个 int findMaxForm(vector<string>& v, int m, int n) { re原创 2022-05-17 13:10:36 · 136 阅读 · 0 评论 -
[01背包][dfs]leetcode494:目标和(medium)
题目:解题思路:1)利用动态规划解题:1.每个元素可看作一个物品,+1表示将此物品取出,-1表示将此物品放回2.sum表示将所有物品全部取出,sum+S表示有些物品取出两次,有些物品取出后又放回,这样就是表示+1的有两次,除以2就是+1的取出一次。3.本题本质和01背包一样的,利用动态规划解题2)使用DFS穷举所有可能的情况,暴搜+剪枝代码如下:class Solution ...原创 2019-08-10 09:29:38 · 347 阅读 · 0 评论 -
[01背包]leetcode416:分割等和子集(medium)
题目:题解:本题的难点在于如何将问题转换为01背包:题目要求我们将数组元素分成两个总和相等的子集,也就是我们需要从数组中选出若干个元素(每个元素只能选一次),使得元素之和等于所有元素的一半,显然使用 01 背包的模型做了。代码如下:class Solution {public: // 思路:转换为01背包,每件物品只能选一次,求是否能恰好装满sum/2 bool canPartition(vector<int>& v) { ret原创 2022-05-15 09:29:20 · 164 阅读 · 0 评论 -
[完全背包]leetcode139:单词拆分(medium)
题目:题解:动态规划dp[i]表示s[0]~s[i]是否可以由字典中的单词构成,是为1,不是则为0。dp[n]表示s[0]至s[n-1]是否由字段中的单词构成。初始化dp[0]=1,表示空字符串在字典中。状态转移方程:若s[0] ~ s[j]由字典中的单词构成且s[j] ~ s[i]也在字符中,则s[0]~s[i]由字典中的单词构成 ;否则s[0] ~ s[i]不是由字典中的单词构...原创 2019-11-02 21:34:01 · 258 阅读 · 0 评论 -
[完全背包]leetcode1449:数位成本和为目标值的最大数字(hard)
题目:题解:翻译下题目:给定一个物品数组,和一个体积 n,求恰好装满 n 的最大价值。其中物品数组的价值为物品编号[1,m],体积为v[0,m-1]。注意每次将可以转移的物品价值加到字符串前面,因为物品价值 i 是由小到大遍历的,只有加到前面才能保证最终的最大价值最大。代码如下:class Solution {public: // 完全背包裸题:每个物品可以使用无限次,求恰好装满n的最大价值 string largestNumber(vector<int>&原创 2022-05-14 16:41:34 · 213 阅读 · 0 评论 -
[线性dp][完全背包]leetcode70:爬楼梯(eary)
题目:题解:leetcode官方详细题解代码如下:class Solution {public: //解法1:斐波那契数 int climbStairs_1(int n) { if(n==1)return 1; int first=1,second=2; for(int i=3;i<=n;++i) ...原创 2019-09-23 23:09:30 · 254 阅读 · 0 评论 -
[完全背包]leetcode377:组合总和 Ⅳ(medium)
题目:题解:注意点:完全背包求组合数时,外层 for 循环先遍历物品,内层 for 循环再遍历背包体积,这样可保证组合数唯一。因为先遍历物品,其实就是限制物品的种类是[1,i],在此基础上上去考虑不同的背包容量,其实这里物品的选择顺序就已经固定了,比如物品1、物品3、物品5。二维状态 dp 数组是一行一行的进行更新的。完全背包求排列数时,外层 for 循环先遍历背包体积,内层 for 循环再遍历物品,这样可保证所有物品的相对顺序不同,保证排列唯一。先遍历背包,其实就是限定了背包的体积,物品原创 2022-05-14 10:22:01 · 319 阅读 · 0 评论 -
[完全背包]leetcode518:零钱兑换 II(medium)
题目:题解:思路:来自AcWing 900. 整数划分的完全背包解法。代码如下:const int M = 310, N = 5010;// 状态f[i][j]表示从前i种物品中选且总体积恰好为j的选法的方案数int f[M][N];class Solution {public: // 完全背包解法:给定m种物品的体积,每种物品可使用无限次,求恰好装满体积n的所有方案数 int change(int n, vector<int>& v) {原创 2022-05-13 15:16:02 · 297 阅读 · 0 评论 -
[贪心法+回溯法][完全背包]leetcode322:零钱兑换(medium)
题目:题解:贪心+回溯贪心:将零钱由大到小排序,便于首先选择面值较大的零钱回溯:若某个零钱选择之后,它后面的小零钱不能完成兑换的话,我们需要回溯,也就是将面值较大的零钱减少一张加速 or 剪枝:每次直接将面值大的零钱选用最大张数,加速零钱兑换;若可兑换的零钱数大于 res 了,那么我们应该剪枝,也就是将将面值较大的零钱减少一张。代码如下:class Solution {p...原创 2020-03-08 22:59:34 · 1471 阅读 · 0 评论 -
[完全背包]leetcode279:完全平方数(medium)
题目:题解:思考过程:首先由于完全平方数是有限的,而且要凑成的数字是给定的。因此第一步可以将完全平方数可以直接预处理出来,范围在[1,sqrt(n)]之间,这就是相当于是完全背包中的每种的物品体积了,而 n 相当于是背包总体积要恰好为 n。所以题目转换为给定 m 种物品,每种物品的题目分别是1、4、9...,每种物品可以选无限次,求恰好装满体积为 n 的最少物品数。状态 f[i][j] 的初始化:由于要求题目恰好装满 j,所以对于体积没有装满 j 的状态需要设为无效值,即在初始化时全部原创 2022-05-13 11:11:13 · 393 阅读 · 0 评论