將正整數(shù)n 表示成一系列正整數(shù)之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。正整數(shù)n 的這種表示稱為正整數(shù)n 的劃分。正整數(shù)n 的不同的劃分個數(shù)稱為正整數(shù)n 的劃分?jǐn)?shù)。
輸入標(biāo)準(zhǔn)的輸入包含若干組測試數(shù)據(jù)。每組測試數(shù)據(jù)是一個整數(shù)N(0 < N <= 50)。輸出對于每組測試數(shù)據(jù),輸出N的劃分?jǐn)?shù)。樣例輸入5樣例輸出7提示5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
思路:
根據(jù)n和m的關(guān)系,考慮以下幾種情況: (1)當(dāng)n=1時,不論m的值為多少(m>0),只有一種劃分即{1}; (2)當(dāng)m=1時,不論n的值為多少,只有一種劃分即n個1,{1,1,1,...,1}; (3)當(dāng)n=m時,根據(jù)劃分中是否包含n,可以分為兩種情況: (a)劃分中包含n的情況,只有一個即{n}; (b)劃分中不包含n的情況,這時劃分中最大的數(shù)字也一定比n小,即n的所有(n-1)劃分。 因此 f(n,n) =1 + f(n,n-1); (4)當(dāng)n<m時,由于劃分中不可能出現(xiàn)負(fù)數(shù),因此就相當(dāng)于f(n,n); (5)但n>m時,根據(jù)劃分中是否包含最大值m,可以分為兩種情況: (a)劃分中包含m的情況,即{m, {x1,x2,...xi}}, 其中{x1,x2,... xi} 的和為n-m,因此這情況下 為f(n-m,m) (b)劃分中不包含m的情況,則劃分中所有值都比m小,即n的(m-1)劃分,個數(shù)為f(n,m-1); 因此 f(n, m) = f(n-m, m)+f(n,m-1); 綜上所述: f(n, m)= 1; (n=1 or m=1) f(n,m) = f(n, n); (n<m) 1+ f(n, m-1); (n=m) f(n-m,m)+f(n,m-1); (n>m)
代碼:
#include<iostream>using namespace std;int sp(int n,int m) { if(n==1||m==1) return 1; else if(n<m) return sp(n,n); else if(n==m) return sp(n,n-1)+1; else return sp(n,m-1)+sp(n-m,m);}int main() { int n; while(cin>>n) { cout<<sp(n,n)<<endl; } return 0;}
新聞熱點(diǎn)
疑難解答