整数的分划问题。

 

整数的分划问题。 
如,对于正整数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+1 
现在的问题是,对于给定的正整数n,编写算法打印所有划分。
用户从键盘输入 n (范围1~10)

搜索算法1:

#include<iostream>
using namespace std;
int n, result[1000];
void print(int k) {
	for (int i = 1; i <= k; i++)
		cout << result[i] << " ";
	cout << endl;
}
void search(int k) {
	for (int i = n; i > 0 && n >= 0; i--) {
		if (i <= result[k - 1]) {
			result[k] = i;
			n -= i;
			if (n == 0)
				print(k);
			else
				search(k + 1);
			n += i;		//回溯一步
		}
	}
}
int main() {
	cin >> n;
	result[0] = n + 1;
	search(1);
	return 0;
}

搜索2:

#include<iostream>
using namespace std;
int n, result[1000], t;
void print(int k) {
	for (int i = 1; i <= k; i++)
		cout << result[i] << " ";
	cout << endl;
}
void search(int k, int sum) {
	for (int i = result[k - 1]; i > 0; i--) {
		if (i <= result[k - 1]) {
			result[k] = i;
			if (sum + i >= n) {
				if (sum + i == n)
					print(k);
			}
			else
				search(k + 1, sum + i);
		}
	}
}
int main() {
	cin>>n;
	result[0] = n + 1;
	search(1, 0);
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值