啰嗦几句
背包问题难度不高,就那么几个类,自己写一遍代码准没错。
0-1背包问题
对应leetcode:416、474、1049
动态规划解决这个问题。对某一物品,要么放入背包,要么不放,就这两种选择方式。对所有的物品都如此思考一遍后就得到了结论。用递归来实现动态规划肯定是一件不好的事情,慢,且容易栈溢出。
那就用循环呗,还有啥好商量的么?就是事前先定义好dp数组,根据状态数量确定是一维还是二维数组,然后搞就完事儿了。改成循环后,思考的方式就变了,变成:已经得知了第i个的最优解,如何求解第i+1的最优解。
这里如何判断是需要建立几维dp数组呢?很显然,是前多少人能达到多少数量,所以是二维。
另外压缩也了解一下吧,不然dp数组要爆炸了。
总的来说,这道题可以有三种写法,咱们就放最好的一种:压缩后的dp。上代码:
leetcode:416 medium 0-1背包问题
class Solution {
public:
bool canPartition(vector<int>& nums) {
const int length = nums.size();
int sum = 0;
for (int i = 0; i < length; ++i)
sum += nums[i];
if (sum % 2 == 1)
return false;
const int halfSum = sum / 2;