摘要: ☆☆☆☆思路:把所有符号为正的数总和设为一个背包的容量,容量为x;把所有符号为负的数总和设为一个背包的容量,容量为y。 令sum为数组的总和,则x+y = sum。而两个背包的差为S,则x-y=S。从而求得x=(S+sum)/2。 因此,题目转换为0-1背包问题:给定一个数组和一个容量为x的背包,求 阅读全文
posted @ 2021-01-03 22:09 不学无墅_NKer 阅读(40) 评论(0) 推荐(0) 编辑
摘要: class Solution { /** * 举个例子: * dp["onetwothreefour"] = dp["onetwothree"这一段] && 判断一下"four" */ public boolean wordBreak(String s, List<String> wordDict) 阅读全文
posted @ 2021-01-03 21:35 不学无墅_NKer 阅读(46) 评论(0) 推荐(0) 编辑
摘要: 题目解释:用 m 个0 和 n 个1,最多可以组成数组中的多少个01串? 示例2之所以不能是 “10”,原因是虽然1个0和1个1可以组成“10”,但只组成了数组中的1个元素,不是最大的。 ☆☆☆☆思路:本题是二维的0-1背包问题,把总共的 0 和 1 的个数视为背包的容量 0-1背包,即数组中的元素 阅读全文
posted @ 2021-01-03 20:57 不学无墅_NKer 阅读(75) 评论(0) 推荐(0) 编辑
摘要: 思路:类似于爬楼梯问题。楼梯的阶数一共为target,一次可以走的步数为nums[i]。 一共有多少种走法? 爬楼梯问题,target在外层。 也可以看成 完全背包问题,即数组中的元素可重复使用。技巧是 nums放在外循环,target在内循环。且内循环正序。 但是如果组合问题需考虑元素之间的顺序, 阅读全文
posted @ 2021-01-03 19:48 不学无墅_NKer 阅读(69) 评论(0) 推荐(0) 编辑
摘要: 思路:类似于跳台阶(爬楼梯)问题。 爬楼梯问题的 target 在外层。 class Solution { /** * 思路; 转化为跳台阶问题 * 1. 状态的定义: dp[i] 表示到i台阶时的最小步数, 也即凑齐i需要的最少硬币数 * 2. 状态转移方程 dp[i] = min {dp[i-c 阅读全文
posted @ 2021-01-03 19:10 不学无墅_NKer 阅读(68) 评论(0) 推荐(0) 编辑
摘要: ☆☆☆☆☆思路:转化为0-1背包问题。 即,是否可以从输入数组中挑出一些正整数,使得这些数的和 等于 整个数组和的一半。 本题与传统0-1背包问题的不同在于,传统0-1 背包问题要求 选取的物品的重量之和 不能超过 背包的容量;而本题选取的数字之和需要 恰好等于 规定的和的一半。 这一点的区别,决定 阅读全文
posted @ 2021-01-03 16:33 不学无墅_NKer 阅读(114) 评论(0) 推荐(0) 编辑
摘要: class Solution { public int maxProfit(int[] prices) { if (prices == null || prices.length == 0) return 0; int len = prices.length; int[][] dp = new in 阅读全文
posted @ 2021-01-03 10:20 不学无墅_NKer 阅读(97) 评论(0) 推荐(0) 编辑