1.純遞迴
設函式func(int n, int m) 定義為計算 把整數 n 劃分為 小於或等於 m 的一系列數字之和 的劃分方法有多少種,則對於:
(1)當 n == 1 時,無論 m 取何值,都只能 劃分為 1;
(2)當 m == 1 時 ,無論 n 為何值, 也只能劃分為 n 個 1 相加 ,只有一種劃分方法;
(3)當 n < m, 顯然 func(n, m) = func(n , n);
(4)當 n > m 時, 可分兩種情況討論,
(1)劃分中包含 m 時, 有func(n -m, m) 種劃分方法;
(2)劃分中不包含 m 時, 有 func(n, m-1)種劃分方法;
所以 func(n ,m) = func(n -m, m) + func(n, m-1);
(5)當 n == m 時,當劃分包含 m 時, m = m ,只有一種劃分方法;
當 不包含 m 時, 有 func(n, m-1) 種劃分方法。
根據以上分析:
func( n, n ) = 1, 當 n ==1;
func( n, n ) = 1,當m == 1;
func( n, n ) = func( n,n ) , 當
n < m;
func( n, n ) = func( n, m-1) +1 , 當n == m;
func( n, n ) = func ( n - m, m ) + func ( n , m -1) , 當n > m;
相應的**如下:
/** 1.cpp
* * created on: 2023年9月01日
* author: administrator
*/#include using namespace std;
int func(int n, int m)
else if(n < m)
else if (n == m)
else if(n >= m)
}int main()
else if(n < m)
else
} else if (n == m)
else
} else if(n > m)
}int main(){
int n;
memset(dp,-1,sizeof(dp));
while(cin>>n){
cout<
/** 1.cpp
* * created on: 2023年9月01日
* author: administrator
*/#include#includeusing namespace std;
#define n 55
int f[n][n];
int main(){
int n;
while(cin>>n){
n++;
for(int j=1;j<=n;j++){
f[1][j]=1;
for(int i=2;i<=n;i++){
if(i
簡單的整數劃分問題
總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n...
openjudge 簡單的整數劃分問題
100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入標準的輸入包含若干組測試資料。每組測試資料是乙個整數n 0 n 5...
4117 簡單的整數劃分問題
總時間限制 100ms 記憶體限制 65536kb 描述 將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。輸入 標準的輸入包含若干組測試資料。每組測試資料是乙個整數...