正整数 n 所有可能的和式的组合

正整数 n 所有可能的和式的组合(如; 4=1+1+1+1、 1+1+2、 1+3、2+2、4)

代码的思想是,从最小值开始,依次加入序列中,整体类似DFS(深搜),因为有回退的一步。区别是加入一个值s,代表可加入序列的最小值。
代码:

vector<int> v;
vector<vector<int>> vv;

void fun(int val,int s)
{
	if (val == 0) {
		vv.push_back(v);
		return;
	}
	for (int i = s; i <= val; i++)
	{
		v.push_back(i);
		fun(val - i,i);
		v.pop_back();
	}
}

int main()
{
	fun(10,1);
	for (int i=0;i<vv.size();i++)
	{
		for (int j = 0; j < vv[i].size(); j++
			cout << vv[i][j];
		cout << endl;
	}
	return 0;
}

输出:

1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 2
1 1 1 1 1 1 1 3
1 1 1 1 1 1 2 2
1 1 1 1 1 1 4
1 1 1 1 1 2 3
1 1 1 1 1 5
1 1 1 1 2 2 2
1 1 1 1 2 4
1 1 1 1 3 3
1 1 1 1 6
1 1 1 2 2 3
1 1 1 2 5
1 1 1 3 4
1 1 1 7
1 1 2 2 2 2
1 1 2 2 4
1 1 2 3 3
1 1 2 6
1 1 3 5
1 1 4 4
1 1 8
1 2 2 2 3
1 2 2 5
1 2 3 4
1 2 7
1 3 3 3
1 3 6
1 4 5
1 9
2 2 2 2 2
2 2 2 4
2 2 3 3
2 2 6
2 3 5
2 4 4
2 8
3 3 4
3 7
4 6
5 5
10

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值