nyoj 571 整數劃分 --- 一個老生長談的問題:

http://www.cnblogs.com/xiaoxian1369/archive/2011/09/12/2174212.html


整數劃分 --- 一個老生長談的問題:
  1) 練練組合數學能力.
  2) 練練遞歸思想
  3) 練練DP
  總之是一道經典的不能再經典的題目:
  這道好題求:
  1. 將n劃分成若干正整數之和的劃分數。
  2. 將n劃分成k個正整數之和的劃分數。
  3. 將n劃分成最大數不超過k的劃分數。
  4. 將n劃分成若干奇正整數之和的劃分數。
  5. 將n劃分成若干不同整數之和的劃分數。

 

1.將n劃分成不大於m的劃分法: 

   1).若是劃分多個整數可以存在相同的:

    dp[n][m]= dp[n][m-1]+ dp[n-m][m]  dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。
       則劃分數可以分爲兩種情況:
       a.劃分中每個數都小於 m,相當於每個數不大於 m- 1, 故劃分數爲 dp[n][m-1].
       b.劃分中有一個數爲 m. 那就在 n中減去 m ,剩下的就相當於把 n-m 進行劃分, 故劃分數爲 dp[n-m][m];

  2).若是劃分多個不同的整數:

  dp[n][m]= dp[n][m-1]+ dp[n-m][m-1]   dp[n][m]表示整數 n 的劃分中,每個數不大於 m 的劃分數。
      同樣劃分情況分爲兩種情況:
      a.劃分中每個數都小於m,相當於每個數不大於 m-1,劃分數爲 dp[n][m-1].
      b.劃分中有一個數爲 m.在n中減去m,剩下相當對n-m進行劃分,

   並且每一個數不大於m-1,故劃分數爲 dp[n-m][m-1]

  2.將n劃分成k個數的劃分法:

 dp[n][k]= dp[n-k][k]+ dp[n-1][k-1];

     方法可以分爲兩類:
       第一類: n 份中不包含 1 的分法,爲保證每份都 >= 2,可以先拿出 k 個 1 分
     到每一份,然後再把剩下的 n- k 分成 k 份即可,分法有: dp[n-k][k]
       第二類: n 份中至少有一份爲 1 的分法,可以先那出一個 1 作爲單獨的1份,剩
     下的 n- 1 再分成 k- 1 份即可,分法有:dp[n-1][k-1]

  

  3.將n劃分成若干奇數的劃分法:

    g[i][j]:將i劃分爲j個偶數

    f[i][j]:將i劃分爲j個奇數
     g[i][j] = f[i - j][j];
     f[i][j] = f[i - 1][j - 1] + g[i - j][j];


發佈了57 篇原創文章 · 獲贊 11 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章