蓝桥杯 ALGO-633 加法分解

1.题目(题目来源于蓝桥杯练习系统)

问题描述

  给一个正整数n,输出它所有的正整数加法的分解方法。其中交换加数的位置视为不同的分解方案。按字典序输出。特别地,不分解也视为一种分解方案。

输入格式

  输入共一行一个正整数n。

输出格式

  输出若干行,为n的所有正整数加法分解方法。每种方案输出一行。对于一种方案,先输出n,再输出一个“=”。然后输出分解的各数,不同的数之间用“+”连接。

样例输入

5

样例输出

5=1+1+1+1+1
5=1+1+1+2
5=1+1+2+1
5=1+1+3
5=1+2+1+1
5=1+2+2
5=1+3+1
5=1+4
5=2+1+1+1
5=2+1+2
5=2+2+1
5=2+3
5=3+1+1
5=3+2
5=4+1
5=5

数据规模及限制

  对于100的数据,n为正整数且n≤15。

2.思路

        本题可采用递归进行求解。我们从样例输出可以看到:组成结果的数字最小为1,最大为n(即可选择的数为1~n)。每次用n减去可选择的数,直至n为0为止,那么这些已选择的数相加能组成n,输出后返回继续搜索其它结果。若n<0,则这些数不能相加组成n,返回搜索可行解;若n>0,则还需要其它数的加入才能组成n,继续向前搜索。每次选择从1开始到n结束,即可保证字典序输出(即从小到大,类似字符串大小的比较)。

3.代码

#include 
using namespace std;

//arr用于储存每次搜索选择的数;step用于记录已选择数的个数,以便输出和返回后数组内容的更改
//index用于输出“n=”
void Solution(int n, vector&arr, int step, int index) {
	if (n < 0) {
		return;
	} else if (n == 0) {
        //每次输出一个结果
		cout << index << "=";
		for (int i = 0; i < step; ++i) {
			if (i != step - 1) {
				cout << arr[i] << "+";
			} else {
				cout << arr[i];
			}
		}
		cout << endl;
	} else {
        //搜索选择
		for (int i = 1; i <= n; ++i) {
			arr[step] = i;
			Solution(n - i, arr, step + 1, index);
		}
	}
}

int main() {
	int n;
	cin >> n;
	vectorarr(n);
	Solution(n, arr, 0, n);
	return 0;
} 

你可能感兴趣的:(蓝桥杯,蓝桥杯,c++)