這個題目來自於 數字拆解,我將之改為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所提出,某一細胞的鄰居包括上 下 左 右 左上 左下 右上與右下相鄰之細胞,遊戲規則如下 孤單死亡 如果細胞的鄰居小於乙個,則該細胞在下一次狀態將死亡。擁擠死亡 如果細胞的鄰居在四個以上,則該細胞在下一次狀態將死亡。穩定...