LeetCode 416. Partition Equal Subset Sum【01背包变式+是否有解】⭐⭐⭐

题目描述

在这里插入图片描述

知识点

动态规划

结果

在这里插入图片描述

实现

码前思考

  1. 想了好久才发现这是一个0-1背包问题,果然换了一件衣服我就不知道是啥了。。。
  2. 以后看见那种暴力是 O ( 2 n ) O(2^n) O(2n)的算法,首先要想到的就是用背包去优化。。。
  3. 使用“动态规划”解决问题的思路是“以空间换时间”,“规划”这个词在英文中就是“填表格”的意思,代码执行的过程,也可以称之为“填表格”。
  4. 知道是背包问题之后,其他的都是套路了。。。

代码实现

//使用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];
    }
};

码后反思

  1. 以后看见那种暴力是 O ( 2 n ) O(2^n) O(2n)的算法,首先要想到的就是用背包去优化。。。

二刷反思

这个题目的思想跟POJ那道Diving的题目一模一样,都是需要除以2这样运算。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值