摘要:
上一篇討論的是整數劃分問題遞歸方法,下面來討論下非遞歸方法:一般情況下,遇到遞歸問題,若能直接求得遞推式,則可以很容易用數組模擬來實現遞歸,根據已經得出的遞歸關系,可以設置一個二維數組S[][]來存儲數據:for(i=1;i<=n;i++){ S[i][1]=1; S[1][i]=1;}for(i=2;i<=n;i++){for(j=2;j<=m;j++){ i f(i==j)S[i][j]=1+S[i][i-1];else if(i<j)S[i][j]=S[i][i];elseS[i][j]=S[i-j][j]+S[i][j-1];}}
閱讀全文
摘要:
整數劃分問題是算法中的一個經典命題之一,有關這個問題的講述在講解到遞歸時基本都將涉及。所謂整數劃分,是指把一個正整數n寫成如下形式:n=m1+m2+...+mi; (其中mi為正整數,并且1 <= mi <= n),則{m1,m2,...,mi}為n的一個劃分。如果{m1,m2,...,mi}中的最大值不超過m,即max(m1,m2,...,mi)<=m,則稱它屬于n的一個m劃分。這里我們記n的m劃分的個數為f(n,m);例如但n=4時,他有5個劃分,{4},{3,1},{2,2},{2,1,1},{1,1,1,1};注意4=1+3 和 4=3+1被認為是同一個劃分。該問題是
閱讀全文
摘要:
pala提出的問題:十本不同的書放在書架上。現重新擺放,使每本書都不在原來放的位置。有幾種擺法? 這個問題推廣一下,就是錯排問題: n個有序的元素應有n!種不同的排列。如若一個排列式的所有的元素都不在原來的位置上,則稱這個排列為錯排。 下面用遞推的方法推導錯排公式: 當n個編號元素放在n個編號位置,元素編號與位置編號各不對應的方法數用M(n)表示,那么M(n-1)就表示n-1個編號元素放在n-1個編號位置,各不對應的方法數,其它類推. 第一步,把第n個元素放在一個位置,比如位置k,一共有n-1種方法; 第二步,放編號為k的元素,這時有兩種情況.1,把它放到位置n,那么,對于剩下的n-...
閱讀全文
摘要:
C語言:char a = 'a';sizeof(char) = 1sizeof(a) = 1sizeof('a') = 4C++語言:char a = 'a';sizeof(char) = 1sizeof(a) = 1sizeof('a') = 1字符型變量是1字節這個沒錯,奇怪就奇怪在C語言認為'a'是4字節,而C++語言認為'a'是1字節。原因如下:C99標準的規定,'a'叫做整型字符常量(integer character constant),被看成是int型,所以在32位機器
閱讀全文
摘要:
在談述函數調用和返回值問題之前,先來看看C++中內存分配的問題。 C++編譯器將計算機內存分為代碼區和數據區,很顯然,代碼區就是存放程序代碼,而數據區則是存放程序編譯和執行過程出現的變量和常量。數據區又分為靜態數據區、動態數據區,動態數據區包括堆區和棧區。以下是各個區的作用:(1)代碼區:存放程序代碼;(2)數據區a.靜態數據區: 在編譯器進行編譯的時候就為該變量分配的內存,存放在這個區的數據在程序全部執行結束后系統自動釋放,生命周期貫穿于整個程序執行過程。b.動態數據區:包括堆區和棧區 堆區:這部分存儲空間完全由程序員自己負責管理,它的分配和釋放都由程序員自己負責。這個區是唯一一個可以由程.
閱讀全文