码迷,mamicode.com
首页 > 其他好文 > 详细

整数划分,并按字典序(递减)输出

时间:2021-05-03 12:14:56      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:gif   mes   image   oid   push   namespace   family   rgba   cin   

1、  一个整数n(n <=30)可以有多种分划,分划的整数之和为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,dp也可以求出total,但是按照字典序输出似乎有些难办。没想到其他解决方案。

利用DFS,直接从n到1循环,当sum小于n时,继续从小于当前的i往后扩展,直到等于n时,输出结果。

技术图片
 1 #include <iostream>
 2 #include <deque>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 int sum = 0, nn = 0, ans = 0;
 7 deque<int> dq;    // 便于删除插入遍历
 8 
 9 void dfs(int n) {    // 深度优先搜索,从 nn -> 1
10     for (int i = n; i >= 1; i--) {    // 从nn往下遍历
11         dq.push_back(i);
12         sum += i;    
13         if (sum > nn) {        // 剪枝
14             sum -= i;
15             dq.pop_back();
16         }
17         else if (sum == nn) {    // 输出
18             deque<int>::iterator it;
19             for (it = dq.begin(); it != dq.end(); it++)
20                 if (it == dq.begin())
21                     cout << *it;
22                 else
23                     cout << " + " << *it;
24             cout << endl;
25             sum -= i;
26             ans++;
27             dq.pop_back();
28         } else {    // 深度搜索
29             dfs(i);
30             sum -= i;
31             dq.pop_back();
32         }
33     }
34 }
35 
36 int main() {
37     cout << "please input nn : ";
38     cin >> nn;
39     dfs(nn);
40     cout << "total = " << ans << endl;
41     return 0;
42 }
View Code

技术图片

2021-04-30

整数划分,并按字典序(递减)输出

标签:gif   mes   image   oid   push   namespace   family   rgba   cin   

原文地址:https://www.cnblogs.com/2015-16/p/14723429.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!