Day 42 动态规划
理论基础
二维
动规五部曲:
- 确定
dp
数组以及下标的含义 - 确定递推公式
dp
数组初始化- 确定遍历顺序
- 举例推导
dp
数组
一维
01背包外部循环遍历物品,内部循环遍历背包大小
01背包内部循环要用倒序遍历
416. 分割等和子集
01背包问题压缩成一维的时候,外部循环遍历物品,内部循环遍历背包大小(只能是这样)
如果不太清楚怎么做,就自己画表格模拟一下
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = accumulate(nums.begin(), nums.end(), 0);
if (sum & 1) return false;
int target = sum / 2;
vector<int> dp(target + 1, 0);
for (int i = 0; i < nums.size(); i++)
{
for (int j = target; j >= nums[i]; j--)
{
dp[j] = max(dp[j], dp[j - nums[i]] + nums[i]);
}
}
return dp[target] == target;
}
};