洛谷P2404 自然数的拆分问题 刷题笔记 DFS

devtools/2025/1/17 1:58:48/

题目链接https://www.luogu.com.cn/problem/P2404

一道深搜问题

注意观察答案的特点 得出判断合法答案的条件如何表述

观察答案特点 后面的数要比前面的数大

因此我们要加入一些判断 来保证答案合法  

逐个数字进行拆分 

用数组存答案

如果一个数是奇数 分解成两个数相加 则第一个数是(n-1)/2 第二个数是n/2

a【0】记录的是第一个数 n/2下取整正好是(n-1)/2

如果分解偶数则两个数均为n/2 ;

a[0]也能取到

所以i小于等于n/2

for(int i = 1;i <= n/2;i++){
        a[0] = i;
        dfs(n-i,1);
        
    }

接下来写搜索函数

void dfs(int s ,int step){
    if(s == 0){//s被减到0拆分完毕直接输出
        for(int i = 0;i < step-1;i++){
            cout<<a[i]<<"+";
        } 
        cout<<a[step-1]<<endl;
    } 
    for(int i = 1;i <= s;i++){
        if(i<a[step-1]){
            continue;//如果当前要放在式子后面的数i小于前一个已经存好的数 则答案不合法 舍弃
        }
        a[step]=i;//合法答案记录
        dfs(s-i,step+1);//s被拆分掉了i 答案指针移动到下一位
    
    }
}

完整代码

#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include<math.h>
int n;
const int N=10;
int a[N];

using namespace std;
void dfs(int s ,int step){
    if(s == 0){
        for(int i = 0;i < step-1;i++){
            cout<<a[i]<<"+";
        } 
        cout<<a[step-1]<<endl;
    } 
    for(int i = 1;i <= s;i++){
        if(i<a[step-1]){
            continue;
        }
        a[step]=i;
        dfs(s-i,step+1);
    
    }
}
int main(){
    cin>>n;
    for(int i = 1;i <= n/2;i++){
        a[0] = i;
        dfs(n-i,1);
        
    }
    
    
    return 0;
}


http://www.ppmy.cn/devtools/151137.html

相关文章

C/C++中,const、static关键字有什么作用,如何定义、初始化,什么情形下需要用到这两关键字?

在C和C编程中&#xff0c;const和static是两个非常重要的关键字&#xff0c;它们各自有独特的作用和使用场景。下面分别介绍这两个关键字的作用、定义和初始化方法&#xff0c;以及何时需要使用它们。 const 关键字 作用 const关键字用于声明一个变量为常量&#xff0c;即该…

华为2024嵌入式研发面试题

01 你认为最好的排序算法是什么&#xff1f; 在实际的编程中&#xff0c;最好的排序算法要根据实际需求和数据规模来选择&#xff0c;因为每种排序算法都有其优势和劣势。以下是一些常见排序算法及其优缺点&#xff1a; 冒泡排序 冒泡排序是一种简单直观的排序算法&#xff0…

探索 Vue.js 组件开发的新边界:动态表单生成技术

随着前端技术的飞速发展&#xff0c;Vue.js 作为一款灵活、易用且性能优异的框架&#xff0c;一直是开发者心中的不二之选。本文将深入介绍 Vue.js 组件开发中的最新技术之一&#xff1a;动态表单生成技术&#xff0c;并通过具体实例展示如何实现这一高效技术。 为什么选择动态…

YOLOv8从菜鸟到精通(二):YOLOv8数据标注以及模型训练

数据标注 前期准备 先打开Anaconda Navigator&#xff0c;点击Environment&#xff0c;再点击new(new是我下载anaconda的文件夹名称)&#xff0c;然后点击创建 点击绿色按钮&#xff0c;并点击Open Terminal 输入labelimg便可打开它,labelimg是图像标注工具&#xff0c;在上篇…

AI 编程工具—Cursor进阶使用 阅读开源项目

AI 编程工具—Cursor进阶使用 阅读开源项目 首先我们打开一个最近很火的项目browser-use ,直接从github 上克隆即可 索引整个代码库 这里我们使用@Codebase 这个选项会索引这个代码库,然后我们再选上这个项目的README.md 文件开始提问 @Codebase @README.md 这个项目是用…

快速上手 HarmonyOS 应用开发

一、DevEco Studio 安装与配置 1. DevEco Studio 简介 DevEco Studio 是 HarmonyOS 的一站式集成开发环境&#xff08;IDE&#xff09;&#xff0c;提供了丰富的工具和功能&#xff0c;支持 HarmonyOS 应用开发的全流程。 2. DevEco Studio 下载与安装 下载地址&#xff1a…

【Web安全】SQL 注入攻击技巧详解:UNION 注入(UNION SQL Injection)

【Web安全】SQL 注入攻击技巧详解&#xff1a;UNION 注入&#xff08;UNION SQL Injection&#xff09; 引言 UNION注入是一种利用SQL的UNION操作符进行注入攻击的技术。攻击者通过合并两个或多个SELECT语句的结果集&#xff0c;可以获取数据库中未授权的数据。这种注入技术要…

【Uniapp-Vue3】组合式API中的组件的生命周期函数(钩子函数)

在Uniapp中生命周期函数用得较多的是onMounted和onUnmounted。 一、onMounted函数 如果我们想要获得DOM元素&#xff0c;就需要给DOM标签上添加ref属性&#xff0c;并定义一个相同属性名的变量。 但是我们输出这个DOM元素为NULL 如果我们使用onMounted就能获得到DOM元素&…