【编程题-错题集】分割等和子集(动态规划 - 01背包)

简介: 【编程题-错题集】分割等和子集(动态规划 - 01背包)


一、分析题目

01 背包 问题:将原问题转换成:从 n 个数中选,总和恰好为 sum / 2,看能否挑选出来。

  • 状态 dp[i][j] 表示:从前 i 个数中挑选,总和恰好为 j,能否凑成。
  • 状态转移方程:dp[i][j] = dp[i-1][j] || dp[i-1][j-arr[i]],第二个状态必须保证 j>= arr[i]
  • 初始化:dp[0][0] = true
  • 返回值:dp[n][sum/2]

二、代码

1、值得学习的代码

//牛客
#include <iostream>
using namespace std;
 
const int N = 510, M = 510 * 110 / 2;
 
int n;
int arr[N];
int dp[N][M];
 
int main()
{
    cin >> n;
    int sum = 0;
    for(int i = 1; i <= n; i++)
    {
        cin >> arr[i];
        sum += arr[i];
    }
 
    if(sum % 2 == 1) cout << "false" << endl;
    else
    {
        sum /= 2;
        dp[0][0] = true;
        for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j <= sum; j++)
            {
                dp[i][j] = dp[i - 1][j];
                if(j >= arr[i])
                {
                    dp[i][j] = dp[i][j] || dp[i - 1][j - arr[i]];
                }
            }
        }
        if(dp[n][sum]) cout << "true" << endl;
        else cout << "false" << endl;
    }
 
    return 0;
}

2、力扣 AC 代码(推荐)

//二维dp
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        for(auto e:nums)
            sum+=e;
        if(sum%2==1)
            return false;
        int target=sum/2;
        vector<vector<int>> dp(n, vector<int>(target+1));
        for(int i=1; i<n; i++)
        {
            for(int j=0; j<=target; j++)
            {
                if(j>=nums[i])
                    dp[i][j]=max(dp[i-1][j], dp[i-1][j-nums[i]]+nums[i]);
                else
                    dp[i][j]=dp[i-1][j];
                if(dp[i][j]==target)
                    return true;
            }
        }
        return false;
    }
};
 
//一维dp
class Solution {
public:
    bool canPartition(vector<int>& nums) {
        int n=nums.size();
        int sum=0;
        for(auto e:nums)
            sum+=e;
        if(sum%2==1)
            return false;
        int target=sum/2;
        vector<int> dp(20010);
        for(int i=1; i<n; i++)
        {
            for(int j=target; j>=nums[i]; j--)
            {
                dp[j]=max(dp[j], dp[j-nums[i]]+nums[i]);
                if(dp[j]==target)
                    return true;
            }
        }
        return false;
    }
};

三、反思与改进

刚拿到这道题就直接暴力破解了,竟然还通过了 90% 的样例,导致我一度怀疑是不是有哪个特殊样例没考虑到。对数组直接进行排序,然后对总和进行判断,奇数直接 false,偶数就取总和的一般 half 作为 目标值 target,接着遍历数组进行累加,刚好等于 half 则为 true,但这样做就忽略了所选的元素可能不是连续的这一点,所以这是错的。

一般遇到这种等于 target 值的题目可以考虑背包问题。


相关文章
|
弹性计算 网络安全 容器
SSL证书更新后不生效
SSL证书更新后不生效
|
3月前
|
人工智能 自然语言处理 API
阿里云Token Plan(团队版)和Coding Plan怎么选?功能、支持的模型、收费方式与选择指南
阿里云百炼平台提供的Token Plan(团队版) 与 Coding Plan是两种面向不同使用场景的大模型订阅服务。以下将从功能定位、支持模型、计费方式三个维度分别详细介绍,并在此基础上提供清晰的选择策略建议。
|
4月前
|
人工智能 运维 Linux
终端AI编程助手Claude Code全解:安装配置、百炼Token Plan接入与多智能体联动
在AI开发工具生态快速完善的当下,终端原生编程工具Claude Code凭借轻量、任务驱动、多模型兼容的特性,成为开发者主流辅助工具。区别于传统IDE插件类代码补全工具,Claude可直接在终端完成项目分析、批量文件修改、脚本生成、Git运维、自动化测试等全流程操作,无需频繁切换图形界面。同时它完整兼容国产大模型接口,可无缝对接阿里云百炼Token Plan订阅服务,解决海外模型网络延迟、计费成本高的痛点。
609 0
|
6月前
|
人工智能
HappyHorse 1.0 系列模型使用指南
HappyHorse 1.0 是一款基于原生多模态架构的新一代 AI 视频生成模型,支持音视频协同生成;产品深度适配广告营销、电商展示、短剧制作与社交媒体创意等内容生产场景。
|
7月前
|
人工智能 机器人 Linux
OpenClaw 阿里云轻量+本地部署:企业微信集成、大模型千问/Coding Plan对接与常见问题解答
OpenClaw(原Clawdbot)作为本地优先、模块化的AI代理平台,2026年版本深度适配企业微信生态,可实现企业微信内自然语言交互、任务自动化、信息查询与办公协作全场景覆盖。本文提供2026年阿里云轻量服务器、本地MacOS/Linux/Windows11完整部署流程,详解企业微信接入(自建应用+机器人双模式)、阿里云千问大模型API与免费Coding Plan API配置方法,附可直接复制的代码命令与高频问题解决方案,零基础用户也能快速搭建稳定、安全、可协作的企业级AI助手系统。
846 5
|
10月前
|
机器学习/深度学习 人工智能 芯片
当算力变成“新石油”:AI 芯片的战争、底层逻辑与未来爆点
当算力变成“新石油”:AI 芯片的战争、底层逻辑与未来爆点
531 15
|
10月前
|
JSON 算法 Shell
实测腾讯混元HY-World 1.5:虚拟世界的推理实战
腾讯混元HY-World 1.5发布,全球首个开源、实时交互且具长时几何一致性的3D世界模型。支持24帧/秒流式生成,适用于虚拟拍摄、仿真合成等场景。提供双向、自回归及蒸馏模型,兼顾质量与速度。现已开放GitHub、Hugging Face及Lab4AI一键体验平台,助力创作者构建沉浸式虚拟世界。
651 0
|
11月前
|
JSON API 数据格式
亚马逊获取商品评论的API接口
本文详细介绍如何通过亚马逊Product Advertising API(PAAPI)获取商品评论数据,涵盖API配置、认证签名、Python调用示例及响应解析。适用于开发价格比较、口碑分析等应用,强调合规使用与频率限制。
|
安全 Windows
电脑错误代码0xc0000001
电脑出现错误代码0xc0000001通常表示系统启动失败,可能由系统文件损坏、硬件故障或驱动冲突等原因引起。以下是详细的解决方法
|
JSON 安全 API
淘宝订单接口对接实战:从申请到代码实现的全流程
随着电子商务的飞速发展,订单管理已成为电商生态中的核心环节。为了更高效地进行订单管理,许多商家选择通过API接口与外部系统进行数据交互。本文以淘宝订单接口为例,详细介绍如何从申请到代码实现,成功对接淘宝订单接口。

热门文章

最新文章