题目描述
知识点
动态规划
结果
实现
码前思考
- 想了好久才发现这是一个0-1背包问题,果然换了一件衣服我就不知道是啥了。。。
- 以后看见那种暴力是 O ( 2 n ) O(2^n) O(2n)的算法,首先要想到的就是用背包去优化。。。
- 使用“动态规划”解决问题的思路是“以空间换时间”,“规划”这个词在英文中就是“填表格”的意思,代码执行的过程,也可以称之为“填表格”。
- 知道是背包问题之后,其他的都是套路了。。。
代码实现
//使用0-1背包进行求解,dp[i][j]代表可行解
class Solution {
public:
bool canPartition(vector<int>& nums) {
int sum = 0;
for(auto i : nums){
sum += i;
}
//如果是奇数
if(sum%2 == 1){
return false;
}
//偶数则除以2
sum /= 2;
//使用背包求解可行解
int len = nums.size();
vector<bool> dp(sum+10,false);
//dp常见套路初始化
dp[0] = true;
//开始递推
for(int i=0;i<len;i++){
for(int j=sum;j>=nums[i];j--){
if(dp[j-nums[i]]){
dp[j] = true;
}
if(dp[sum]){
return true;
}
}
}
return dp[sum];
}
};
码后反思
- 以后看见那种暴力是 O ( 2 n ) O(2^n) O(2n)的算法,首先要想到的就是用背包去优化。。。
二刷反思
这个题目的思想跟POJ那道Diving
的题目一模一样,都是需要除以2
这样运算。