主要是把动态规划的PDF二刷了一遍,巩固基础;各大厂的机试里面考动态规划还是挺多的,掌握好非常重要。
周末学了回溯算法的组合类问题。下周一计划看完回溯;周二~周四学DFS和BFS;周五看贪心;周末总结整理。
给出n个不同物品,每个物品有重量weight和价格value;给出一个背包,每个背包有最大容量W。每件物品只有一件。
一般有如下题型:
判断能否将背包刚好装满 or 装满容量为j的背包有几种方法 -- 组合问题
例题:分割等和子集(正好装满sum/2)、目标和(正好装满(sum+S)/2)
dp[j] += dp[j - nums[i]]
难点在于如何将题目的条件套用背包问题的框架。
求解在背包容量的限制下,可以装下的最大价值
dp[j] = max(dp[j], dp[j - weight[i] + value[i]])
0-1背包的初始化时要注意递推公式中的max后者min,相应的初始化为最小值和最大值。
0-1背包的遍历顺序(滚动数组):先遍历物品,后遍历背包(反过来就会导致每件物品在背包中只放入了一件物品);遍历背包时从后向前遍历(否则每件物品会重复放入)
给出N件物品,每件物品有重量weight和价格value;给出一个背包,每个背包有最大容量W。每件物品有无限多件,可以重复放入。
一般有如下题型:
纯完全背包问题,求最大价值
纯完全背包,遍历顺序皆可,但是遍历背包要从前向后,保证每件物品多次放入。
求装满背包的有几种方法
求组合数量:先遍历物品,后遍历背包(为防止同样的组合重复出现);遍历背包时从前向后(保证物品多次放入)
从前向后遍历背包时,因不能保证背包容量j大于物品重量weight[i],要加判断:j-weight[i] > 0
求排列数量:先遍历背包,后遍历物品(这样重复组合都算进去了);遍历背包也是从前向后(保证物品多次放入)
给出N件物品,每件物品有重量weight,价格value,数量nums;给出一个背包,每个背包有最大容量W。每件物品有在数量限制内,可以重复放入。
解题方法就是把不同的数量都展开,变成0-1背包。具体到代码就是在两重for循环内加一层遍历数量的循环。
考虑第i房间(dp[i-2]+nums[i]) and 不考虑第i房间(dp[i-1])
数组成环考虑3种情况:
3、2包含1,故而只考虑2种情况。将两种不同的首尾参数传入基础打家劫舍逻辑即可。
后序遍历
dp[i][0] 表示第i天持有股票所得最大现金;dp[i][1]表示第i天不持有股票所得最大现金。
第i天持有股票:
第i天不持有股票:
最大值出现在dp[-1][1]的时候
第i天持有股票:
第i天不持有股票:
最大值出现在dp[-1][1]的时候
分类讨论五种情况:对应dp[i][0-4]
dp[i][1-4] 两个来源:当天发生操作,沿用前一天状态
题目改成最多完成k笔交易,找规律即可
还没搞明白,人傻了
没区别,在每次买入or卖出的时候减掉一笔钱就行