整數劃分問題

來源:互聯網
上載者:User

標籤:

問題:

1. 將n劃分成最大數不超過k的劃分數。
2. 將n劃分成k個正整數之和的劃分數。

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];

1.d[i][j] 表示把i分成不大於j的劃分數的種數

int d[maxn][maxn];int dfs(int n,int m){    if(m == 1) return d[n][m] = 1;    if(n < m) return dfs(n,n);    if(m == n) return d[n][m] = dfs(n,m-1) + 1;    return d[n][m] = dfs(n,m-1) + dfs(n-m,m);}

 

整數劃分問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.