C 經典演算法題 數字拆解

2021-10-02 06:22:20 字數 2688 閱讀 5509

這個題目來自於 數字拆解,我將之改為c語言的版本,並加上說明。題目是這樣的:

3=2

+1=1

+1+1 所以3有三種拆法4=

3+1=

2+2=

2+1+

1=1+

1+1+

1 共 五 種5=

4+1=

3+2=

3+1+

1=2+

2+1=

2+1+

1+1=

1+1+

1+1+

1

共七種

依此類推,請問乙個指定數字num的拆解方法個數有多少個?

解法我們以上例中最後乙個數字5的拆解為例,假設f( n )為數字n的可拆解方式個數,而f(x, y)為使用y以下的數字來拆解x的方法個數,則觀察:

5=4

+1=3

+2=3

+1+1

=2+2

+1=2

+1+1

+1=1

+1+1

+1+1

使用函式來表示的話:

f(5) = f(4, 1) + f(3,2) + f(2,3) + f(1,4) + f(0,5)

在這裡插入**片
其中f(1, 4) = f(1, 3) + f(1, 2) + f(1, 1),但是使用大於1的數字來拆解1沒有意義,所以f(1, 4) = f(1, 1),而同樣的,f(0, 5)會等於f(0, 0),所以:

f(5

)=f(

4,1)

+f(3

,2)+

f(2,

3)+f

(1,1

)+f(

0,0)

依照以上的說明,使用動態程式規畫(dynamic programming)來進行求解,其中f(4,1)其實就是f(5-1, min(5-1,1)),f(x, y)就等於f(n-y, min(n-x, y)),其中n為要拆解的數字,而min()表示取兩者中較小的數。

使用乙個二維陣列**table[x][y]來表示f(x, y),剛開始時,將每列的索引0與索引1元素值設定為1,因為任何數以0以下的數拆解必只有1種,而任何數以1以下的數拆解也必只有1種:

for

(i =

0; i < num +

1; i++

)

接下來就開始乙個乙個進行拆解了,如果數字為num,則我們的陣列維度大小必須為num x (num/2+1),以數字10為例,其維度為10 x 6我們的**將會如下所示:

110

0001

1000

0112

0001

1230

0113

4501

1356

7114

7901

1480

0115

0001

1000

0

#include

#include

#define num 10

// 要拆解的數字

#define debug 0

intmain

(void);

// 動態規畫**

int count =0;

int result =0;

int i, j, k;

printf

("數字拆解\n");

printf

("3 = 2+1 = 1+1+1 所以3有三種拆法\n");

printf

("4 = 3 + 1 = 2 + 2 = 2 + 1 + 1 = 1 + 1 + 1 + 1");

printf

("共五種\n");

printf

("5 = 4 + 1 = 3 + 2 = 3 + 1 + 1");

printf

(" = 2 + 2 + 1 = 2 + 1 + 1 + 1 = 1 + 1 +1 +1 +1");

printf

("共七種\n");

printf

("依此類推,求 %d 有幾種拆法?"

, num)

;// 初始化

for(i =

0; i < num; i++

)// 動態規劃

for(i =

2; i <= num; i++

) table[i]

[j]= count;}}

// 計算並顯示結果

for(k =

1; k <= num; k++

) result +

= table[num-k]

[(num-k >= k)

? k : num-k]

;printf

("\n\nresult: %d\n"

, result);if

(debug)

}return0;

}

C 經典演算法題(一)

1.實現strcpy.char mystrcpy char pdest,const char psrc if pdest psrc char piter pdest strlen pdest while piter psrc 0 return pdest 3.實現cstring字串類預設四個方法 c...

經典演算法題

題目 古典問題 有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第四個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?1.程式分析 兔子的規律為數列1,1,2,3,5,8,13,21 分析 首先這個你得找規律,這個剛開始的時候不要太心急。不難看出有個很好的式子 從第三個...

C 經典演算法題 生命遊戲

生命遊戲 game of life 為1970年由英國數學家j.h.conway所提出,某一細胞的鄰居包括上 下 左 右 左上 左下 右上與右下相鄰之細胞,遊戲規則如下 孤單死亡 如果細胞的鄰居小於乙個,則該細胞在下一次狀態將死亡。擁擠死亡 如果細胞的鄰居在四個以上,則該細胞在下一次狀態將死亡。穩定...