
解题步骤:





参考代码:
未优化代码:
- class Solution {
- public:
- bool canPartition(vector<int>& nums) {
- int n=nums.size();
- int sum=0;
- for(const auto& e:nums)
- {
- sum+=e;
- }
- if(sum%2==1)
- {
- return false;
- }
- int aim=sum/2;
- //多开一行,多开一列
- vector
bool>> dp(n+1,vector<bool>(aim+1)); - //初始化
- for(size_t i=0;i<=n;i++)
- {
- dp[i][0]=true;
- }
- for(size_t i=1;i<=n;i++)
- {
- for(size_t j=1;j<=aim;j++)
- {
- dp[i][j]=dp[i-1][j]||((j>=nums[i-1])&&dp[i-1][j-nums[i-1]]);
- }
- }
- return dp[n][aim];
- }
- };
优化后的代码:
- class Solution {
- public:
- bool canPartition(vector<int>& nums) {
- int n=nums.size();
- int sum=0;
- for(const auto& e:nums)
- {
- sum+=e;
- }
- if(sum%2==1)
- {
- return false;
- }
- int aim=sum/2;
- //多开一个位置
- vector<bool> dp(aim+1);
- //初始化
- dp[0]=true;
-
- for(size_t i=1;i<=n;i++)
- {
- //一定记得要从右往左填写
- for(size_t j=aim;j>=nums[i-1];j--)
- {
- dp[j]=dp[j]||dp[j-nums[i-1]];
- }
- }
- return dp[aim];
- }
- };
你学会了吗???