【正文】
s Step 1 39。 Next i Next i nlength = Len(n)N的長度開始刪數(shù)按鈕之所以做出這樣貪心的選擇,是因?yàn)閯hS個數(shù)字的最優(yōu)解,包含了刪除一個數(shù)字的子問題的最優(yōu)解。生活中的更多問題采用順推法就可得到,也即從1N,但不論倒推還是順推,能遞推出并解出問題是我們的本意。 Next i k = k + 1 If Int(s) = s Then 39。 x = 6具體實(shí)現(xiàn)請參看源程序。 s5=x4示例:猴子分食桃子五只猴子采得一堆桃子,猴子彼此約定隔天早起后再分食。剛聽名字挺嚇人的,其實(shí)有好多程序我們平常都見過。這些算法當(dāng)中,最最簡單的莫過于遞推算法了。不過,就在半夜里,一只猴子偷偷起來,把桃子均分成五堆后,發(fā)現(xiàn)還多一個,它吃掉這桃子,并拿走了其中一堆。 s4=s5*5/4+13 k = 0 39。符合情況則將整除標(biāo)志加1為了實(shí)現(xiàn)上述目的,我們可以進(jìn)行S次選擇,每次都選擇N中最大的數(shù)字,此數(shù)字選擇后將不再參與下次的選擇。 Dim i As Integer Dim a() As Integer 39。 ReDim a(nlength 1) 39。 If a(k) a(i) Then d = a(k)刪數(shù)過程N(yùn)ext iEnd Sub(上程序在VB60 Win2000下調(diào)試通過)小結(jié)這就是有趣的貪心算法,說是貪得無厭可以,說是守住當(dāng)前的既得利益,以此為基礎(chǔ),再穩(wěn)扎穩(wěn)打地進(jìn)行下一步也行!下面的老題最能說明這種情況。程序?qū)崿F(xiàn)我們怎樣將這34*21種方案羅列出呢?這么多的方案,最好的辦法是還是用循環(huán)。 Print 公雞,母雞和小雞數(shù)分別為:。小結(jié)這就是列舉法,將可能的情況一網(wǎng)打盡;不過在應(yīng)用過程中,我們最好還是做些優(yōu)化,不然,要浪費(fèi)好多沒必要浪費(fèi)的時間。就象上面的故事那樣,故事中包含了故事本身。示例:小猴吃棗小猴第一天摘下若干棗子,當(dāng)即吃掉了一半,不過癮又多吃了一個;第二天吃了剩下的一半又多吃了一個;以后每一天都吃了前一天剩下的一半多一個。上題中我們只要將monkey(1),即第一天打印出來,一切OK。下面我們通過示例來看一下。子程序如下要用實(shí)現(xiàn)希爾排序,關(guān)鍵是把握好增量的變化情況和最終結(jié)束的控制,設(shè)置變量gap為增量,其值取要排序的所有數(shù)據(jù)的個數(shù)的二分之一(本例中為5),比較時先將第1個數(shù)同第6個比,較大的放到前面,較小的放到后面,2同7,直至全部比較完成;下一次用現(xiàn)在的gap的二分之一作為增量,再進(jìn)行增量大小轉(zhuǎn)換;…;當(dāng)其為0時結(jié)束。gap = Int(n / 2) 39。 a(j) = a(j + gap) = + Str(a(k)) + . For i = 1 To 10 39。 Next i公式如下,選擇四個數(shù):模數(shù)m,乘數(shù)a,增量c和種數(shù)x0,使 2≤am, 0≤cm, 0≤x0m,可以生成一個偽隨機(jī)序列{xn},使得對于所有的n,0≤x0m。小結(jié)隨機(jī)函數(shù)是程序設(shè)計(jì)中一道亮麗的風(fēng)景。就好象我們?nèi)祟愃哂械默F(xiàn)省心的想法,妙手偶得之的佳句。但通常我們要解的問題不在這個范圍內(nèi),如何解決呢?示例:最簡單的抽獎程序,做一個猜1100之間數(shù)的游戲。確定的問題電腦可以處理,不確定的問題電腦也能處理,隨機(jī)函數(shù)就是實(shí)現(xiàn)電腦中不確定事件的重要砝碼。調(diào)用子程序排序并輸出中間結(jié)果 gap = Int(gap / 2)’減小增量 j = 0 j = j gap j = i gap While gap 0從上面分析中不難看出,通過和gap增量有關(guān)的兩重嵌套循環(huán)就能將排序功能實(shí)現(xiàn)。這樣的算法通常稱為分治法:將原問題分成n個規(guī)模較小而結(jié)構(gòu)與原問題相似的子問題。正是有了monkey()函數(shù),在對其自身調(diào)用的過程中實(shí)現(xiàn)了我們的所求,關(guān)于函數(shù)、子程序和他們之間發(fā)生的故事還有很多,僅僅列舉了其中奇妙的幾點(diǎn),還有