整數劃分問題
整數劃分問題是演算法中的乙個經典命題之一,有關這個問題的講述在講解到遞迴時基本都將涉及。所謂整數劃分,是指把乙個正整數n寫成如下形式:
n=m1+m2+...+mi; (其中mi為正整數,並且1 <= mi <= n),則為n的乙個劃分。
遞迴法:
遞推表示式如下:
f(n, m)= 1; (n=1 or m=1) //1劃分為m份,或n劃分為1份
f(n, n); (n1+ f(n, m-1); (n=m) //分成的份數中沒有為0的(即全為1相加),有0的則為f(n,m-1)劃分
f(n-m,m)+f(n,m-1); (n>m)
例項應用:7個蘋果放入三個盤子(無重複).
第一類: n個蘋果放入m個盤子中,三個盤子都不為空,每個盤子先放乙個,問題等同於n-m個蘋果放入m個盤子中,即為d(n-m,m);
第二類: n個蘋果放入m個盤子中,三個盤子有乙個盤子為空,則等同於n個蘋果再放入m-1個盤子,即d(n,m-1);
#include
#include
int partitionhelp(int n,int m)
else if(n==1 ||m==1)
else if(n
void main()
下面的另一解法從網上尋得:
#include
using namespace std;
int a[10]=;
int len = 0;
int count = 0;
void fun(int n,int m)
} }
int main()
整數劃分問題(放蘋果問題)(遞迴)
將正整數n 表示成一系列正整數之和,n n1 n2 nk,其中n1 n2 nk 1 k 1 正整數n 的這種表示稱為正整數n 的劃分。正整數n 的不同的劃分個數稱為正整數n 的劃分數。標準的輸入包含若干組測試資料。每組測試資料是乙個整數n 0 n 50 對於每組測試資料,輸出n的劃分數。5,4 1,...
放蘋果(盤子不一樣)
view submit statistics clarify 總time limit 1000ms memory limit 65535kb description 把m個同樣的蘋果放在n個不同樣的盤子裡,允許有的盤子空著不放,問共有多少種放法?5,1,1和1,5,1是不同的放法。比如輸入2 2,那...
整數劃分問題
整數劃分問題是乙個經典問題,幾乎在講演算法設計的書中都會講,下面把主要的思想給總結下。所謂整數劃分,就是將乙個正整數n劃分為一系列的正整數之和,如將n可以劃分為 1 我們該如何找出所有的劃分呢?我們可以先來看看整數劃分的規律 譬如正整數 6 劃分情況如下 6 5 14 2 4 1 1 3 3 3 2...