動態規劃演算法是一種經典的演算法,它是如此美妙的演算法,值得每乙個程式設計師擁有。但是,直到晚上看《演算法導論》,才發現自己現在才全面理解它,不禁狂汗。。。
以經典的揹包問題來展示動態規劃演算法:
**1#include
<
stdio.h
>23
#define
n 4
4#define
w 556
//物品的重量
7intw =
;89//
價值陣列
10int
vi =;11
12int
v[n+
1][w+1
]; //
v[i][j]表示從前i個物品選能夠放進承重量為j的揹包的子集的最大總價值
1314
void
init()
1527
2829
//基於備忘錄的動態規劃演算法
30int
mkfnapsack_memoize(
inti,
intj)
3143
v[i][j]
=value;44}
45return
v[i][j];
//如果v[i][j]已經進行計算,則不進行計算,直接返回即可46}
4748
//自頂向下的動態規劃演算法
49int
mkfnapsack_top_to_bottom(
inti,
intj)
5065
66return
value;67}
6869
//自底向上的演算法
70int
mkfnapsack_bottom_to_top(
intni,
intwi)
7185}86
}87return
v[n][w];88}
8990
void
print_v(
intni,
intwi)
9199
}100
101int
main()
102輸出結果:
自頂向下的遞迴演算法,寫法最簡單,但效率是最低的,它往往把問題搞成指數級。而自底向上的演算法是dp的經典策略,它比自頂向下的效率高,但是,它往往也計算了沒有必要計算的子問題(見上圖)。而基於備忘錄的自頂向下的演算法是前兩者的集大成者,效率最優。
出處:
那些人,那些事
很久沒有整理一下自己的思緒,聽著熟悉的歌,那歌聲會讓我想起那些人,那些事.乙個標點,乙個符號,乙個個早已在歲月深處冰封的眼神,一段沒有伴侶的歸途。一直以來我都認為我的人生就是這樣,平平淡淡,安安靜靜,波瀾不驚地在歲月的 眼角劃過,不留絲毫痕跡。現在看來,原來我寫的東西在很大程度上是是在滿足自己的某種...
那些人,那些事
一年前的今天,我大概和bi11一起奔波於各大招聘會上,白天各睡各的覺,晚上一起在工作室寫著程式 那時候似乎成都已經很冷,工作室有著溫暖的空調.而現在猛烈的陽光一件薄薄的襯衫真讓我不敢相信已經是十一月了.我在成都待了四年,說實話我不喜歡成都,不過還是有著很多讓人快樂的人和事給了我很多快樂的回憶.先說說...
那些人,那些事
回顧一下自己的it職業生涯,應該和大多數同僚一樣,從無知還有些自負的毛頭小子,到在技能上還算熟練,在性格上也變得成熟的奔三人士,在這個過程中給我最大的感覺就是越學習越發現自己懂得東西少,在職場上越來越感覺到僅僅靠技術層面上的提高是不能讓我們大多數人成功的。在自己目前的職業生涯中經歷過太多人太多事,大...