Bailian4117 簡單的整數劃分問題【記憶化遞迴】
阿新 • • 發佈:2018-12-24
4117:簡單的整數劃分問題
總時間限制: 100ms 記憶體限制: 65536kB
描述
將正整數n 表示成一系列正整數之和,n=n1+n2+…+nk, 其中n1>=n2>=…>=nk>=1 ,k>=1 。
正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。
輸入
標準的輸入包含若干組測試資料。每組測試資料是一個整數N(0 < N <= 50)。
輸出
對於每組測試資料,輸出N的劃分數。
樣例輸入
5
樣例輸出
7
提示
5, 4+1, 3+2, 3+1+1, 2+2+1, 2+1+1+1, 1+1+1+1+1
問題連結
問題描述:(略)
問題分析:
這個問題的關鍵是遞推式,這裡就不詳細說明了。另外用記憶化遞迴實現速度上是快。
程式說明:(略)
參考連結:(略)
題記:(略)
AC的C語言程式(優化列舉)如下:
/* Bailian4117 簡單的整數劃分問題 */ #include <stdio.h> #include <string.h> #define N 50 int c[N + 1][N + 1]; int ways(int m, int n) { if(c[m][n]) return c[m][n]; else { if(m == 0) return c[m][n] = 1; else if(n == 0) return 0; else if(n <= m) { if(c[m - n][n] == 0) c[m - n][n] = ways(m - n, n); if(c[m][n - 1] == 0) c[m][n - 1] = ways(m, n - 1); return c[m][n] = c[m - n][n] + c[m][n - 1]; } else if(c[m][n - 1]) return c[m][n - 1]; else return c[m][n - 1] = ways(m, n - 1); } } int main(void) { memset(c, 0, sizeof(c)); int n; while(~scanf("%d", &n)) { printf("%d\n", ways(n, n)); } return 0; }