關於天然數拆分問題的討論
題目以下
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; }