天然數的拆分問題

關於天然數拆分問題的討論
題目以下
Descriptionios

任何一個大於1的天然數n,總能夠拆分紅若干個小於n的天然數之和。

Inputspa

輸入有多組數據,對於每組數據就一個數n。

Outputcode

對於每組輸入輸出n的拆分方法。

Sample Input遞歸

4
7

Sample Outputip

4=1+1+1+1
4=1+1+2
4=1+3
4=2+2
total=4
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14

對於我而言吧,本體看似簡單,畢竟這是一道高中的數學題
可是要用dfs來模擬這個問題的話,確實挺複雜的,畢竟對於我萌新而言,三個參數的dfs想不到,還好有學長知道,多謝flc學長啦
下面是我對此題的理解和解決方案數學

ACcode
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cctype>
using namespace std;
const int N = 1e5+10;
int ans[N],res;
int n;
void dfs(int k,int cnt/*數量*/,int last/*最後一個數*/)
{
    int i;
    if(last!=0) ans[cnt]=last;//若是最後一個數字不爲0,那麼取出這個數字
    if(k==0&&ans[1]!=n)//若是最開始的n的數值變成了0;而且取出的第一個數不是n,那麼輸出該數字(輸出沒有n=n的狀況)
    {
        //下面是輸出的狀況
        printf("%d=%d",n,ans[1]);//輸出第一個數
        for(i=2;i<=cnt;i++)
            printf("+%d",ans[i]);//輸出下面的數
        printf("\n");
        res++;//結果加一,dfs的常規套路
        return ;
    }
    //i=max(last,1),這個則是對於最後一個數與1的比較
    for(i=max(last,1);i<=k;i++)
    {
        dfs(k-i,cnt+1,i);//這一步比較繞,就是遞歸剩下k-i,數量cnt+1,以及最後一位數i;
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        res=0;
        dfs(n,0,0);//遞歸初始last==0,數量cnt==0,而且k==n;
        printf("total=%d\n",res);
    }
    return 0;
}
相關文章
相關標籤/搜索