1. 程式人生 > >P2404 自然數的拆分問題(簡單dfs)

P2404 自然數的拆分問題(簡單dfs)

題目背景

任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。

題目描述

任何一個大於1的自然數n,總可以拆分成若干個小於n的自然數之和。

輸入輸出格式

輸入格式:

輸入:待拆分的自然數n。

輸出格式:

輸出:若干數的加法式子。

輸入輸出樣例

輸入樣例#1: 複製

7

輸出樣例#1: 複製

1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4

說明

用回溯做。。。。n<=8

題目解析:簡單dfs。

	#include <cstdio>
	#include <cstring>
	#include <iostream>
	using namespace std;
	
	int vis[10];
	int a[10];
	int cnt,counts=0;
	void dfs(int n,int k,int t)//為了不重複,所以t引數表明當前的因子中最大的數,接下來的數不能小於它
	{
		if(n == cnt)
		{
			for(int i = 1; i < k; i++)
				cout<<a[i]<<"+";
			cout<<a[k]<<endl;
		}                      //輸出
		for(int i = 1 ; i < cnt; i++ )
		{
			if((n + i <= cnt) && i >= t)
			{ 
			    a[k+1] = i;
			    k++;
				dfs(n+i,k,i);
				k--;
			}
		}
	}
	int main()
	{
		cin>>cnt;
		dfs(0,0,0);
		return 0;
	 }