当前位置: 首页 > ds >正文

一个整数n可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数,详解

目录

题目

解题思路

代码


题目

一个整数n(可以有多种分划,分划的整数之和为n,在不区分分划出各整数的次序时,字典序递减输出n 的各详细分划方案和分划总数。

例如n = 6,程序输出为:

6

5  1

4  2

4  1  1

3  3

3  2  1

3  1  1  1

2  2  2

2  2  1  1

2  1  1  1  1

1  1  1  1  1  1

total = 11

解题思路

想了一下,这题使用dfs解题应该是没问题的

后面的思路假设n为6

设定一个sum从0开始,依次dfs6到1,让sum加上dfs的这个数,如果这个数为6,也就是n的值就可以输出这个解,并且让total加一

可以剪枝一下,如果当前的sum值大于6(n),也就不需要继续dfs了,就直接返回

最后注意题目要求字典序必须从大到小:

我解决这个问题的办法是,dfs的时候,除了传sum还要传上一个加的数字,这样在dfs的第一层,仍旧是dfs从6到1,而到之后的层就是dfs上一个加的数到1,这样就能满足题目的要求。

(*^▽^*)

下面附上我的dfs图,图中划掉了一部分是因为最开始我没看到题目要求字典序要递减(;′⌒`)

代码

#include<iostream>
#include<bits/stdc++.h>
using namespace std;int total = 0;vector<int> a;
//存一个符合条件的答案int n;void dfs(int sum,int upper) {if(sum > n) {return;//减枝}if(sum == n) {//找到符合条件的,进行输出total++;for(auto &i : a) {cout << i << ' ';}cout << '\n';return;}//因为要满足字典序递减//所以第一层遍历n到1//第二层及以后只用遍历上一层加的数到1if(upper == 0) {for(int i = n; i >= 1; i--) {sum += i;a.push_back(i);dfs(sum,i);sum -= i;a.pop_back();}}else {for(int i = upper; i >= 1; i--) {sum += i;a.push_back(i);dfs(sum,i);sum -= i;a.pop_back();}}}int main()
{cin >> n;dfs(0,0);cout << "total = " << total;return 0;
}

 

http://www.xdnf.cn/news/3991.html

相关文章:

  • 5.4学习记录
  • 洛谷 P2473 [SCOI2008] 奖励关
  • TS 类型别名
  • ES6入门---第三单元 模块一:类、继承
  • 【操作系统】死锁
  • [pdf,epub]292页《分析模式》漫谈合集01-59提供下载
  • 【C语言入门级教学】VS使用调试技巧1
  • 算法笔记.求约数
  • 303.整数拆分
  • Seata TCC 实战笔记:从零搭建分布式事务 Demo (含源码)
  • Linux的时间同步服务器
  • 【LLM】deepseek R1之GRPO训练笔记(持续更新)
  • 【TF-BERT】基于张量的融合BERT多模态情感分析
  • 代码随想录算法训练营Day44
  • PyTorch_张量索引操作
  • Spring Cloud Gateway路由+断言+过滤
  • Flask + SQLite 简单案例
  • 位置权限关掉还能看到IP属地吗?全面解析定位与IP的关系
  • 腾讯云服务器技术全景解析:从基础架构到行业赋能​
  • React-router v7 第七章(导航)
  • 如何使用VSCode编写C、C++和Python程序
  • ES类迁移方法
  • 【翻译、转载】MCP 提示 (Prompts)
  • Kubernetes 安装 minikube
  • 计算机图形学编程(使用OpenGL和C++)(第2版) 01.环境搭建
  • Python的ArcPy基于Excel表格对大量遥感影像批量重分类
  • 第8章 Python 其他数据类型概述
  • LeetCode 1007. 行相等的最少多米诺旋转 题解
  • ZArchiver正版:高效文件管理,完美解压体验
  • 二、大模型原理:图文解析Transformer原理与代码