信息學奧賽一本通 1318:【例5.3】自然數的拆分

題目鏈接:點擊這裏
在這裏插入圖片描述
每次都是從上一個數字開始選取,直到加數sum的值等於n時才停止,或者當sum>n時停止。

#include<cstdio>
using namespace std;
int n;
int ans[50];

//sum記錄當前求和,cur爲當前序列元素個數 
void dfs(int sum, int cur)
{
	if(sum>n) 
		return;
	if(sum==n)	//若sum==n,輸出序列 
	{
		printf("%d=",n);
		for(int i=1;i<cur;i++)
			printf("%d+",ans[i]);
		printf("%d\n",ans[cur]);
		return;
	}
	for(int i=ans[cur];i<n;i++)
	{
		ans[cur+1]=i;	//這個值就是下一層遞歸時所用到的i的起始值,這裏old數組記錄下來
		dfs(sum+i, cur+1);	//進入到下一層遞歸
	}
}
int main()
{
	scanf("%d",&n);
	ans[0] = 1;
	dfs(0,0);
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章