【Leetcode动态规划--01背包】416.分割等和子集 1049. 最后一块石头的重量 II 494. 目标和(求装满背包的方法数) 474.一和零

文章目录



Leetcode416.分割等和子集

1.问题描述

在这里插入图片描述

2.解决方案

在这里插入图片描述

解法一:二维dp数组动态规划

a.思路和代码

在这里插入图片描述

在这里插入图片描述

class Solution {
   
public:
    bool canPartition(vector<int>& nums) {
   
        //1.必要准备
        int len=nums.size();
        int sum=0;
        int maxItem=-1;
        for (auto item : nums) {
   
            if(item>maxItem) maxItem=item;
            sum+=item;
        }
        int target=sum/2;

        //2.提前判断
        if(len<2||sum%2!=0||maxItem>target) return false;

        //3.定义加边界
        bool dp[len][target+1]; //使用变量可以声明,但不可以初始化就像这样 bool dp[len][target+1]={false};
        memset(dp, false,len*(target+1)*sizeof(bool)); //非常重要的初始化操作!
        dp[0][nums[0]]=true;
        for(int i=0;i<len;i++) dp[i][0]= true;

        //4.状态转移
        for(int i=1;i<len;i++){
   
            int item=nums[i];
            for(int j=1;j<=target;j++){
   
                if(item>j) dp[i][j]=dp[i-1][j];
                if(item<=j) dp[i][j]= dp[i-1][j] || dp[i-1][j-item];
            }
        }
        return dp[len-1][target];

    }
};
b.总结
1.官方代码实现中有以下三点可以借鉴(都有在其他博客介绍过了,下次自己想着去用)
int sum = accumulate(nums.begin(), nums.end(), 0);
int maxNum = *max_element(nums.begin(), nums.end());

vector<vector<int>> dp(n, vector<int>(target + 1, 0));
2.自己的实现也得谨记
bool dp[len][target+1]; //使用变量可以声明,但不可以初始化就像这样 bool dp[len][target+1]={false};
memset(dp, false,len*(target+1)*sizeof(bool)); //非常重要的初始化操作!
3.如何遍历dp二维数组得到结果也需要考虑,从边界的下一层入手首先是,其次是不担心越界问题,上面手写笔记有提到
//4.状态转移
for(int i=1;i<len;i++){
   
    int item=nums[i];
    for(int j=1;j<=target;j++){
   
        if(item>j) dp[i][j]=dp[i-1][j];
        if(item<=j) dp[i][j]= dp[i-1][j] || dp[i-1
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值