演算法學習 01揹包(動規)

2021-07-09 01:12:51 字數 1111 閱讀 2886

貪心之後來動規啦~看《演算法導論》感覺還是不那麼清楚,還是得自己動手才行~真正寫的時候發現還是沒有真正理解動規的自底向上的求解方法,又看了幾篇博文,才初步了解了01揹包的真正的執行過程。

必須推薦一下參考的文章,也記錄一下,以便日後進一步學習:

不說了,上**:

/*

0-1揹包問題

*/#include

using

namespace

std;

const

int c = 5;//揹包最大容量

const

int n = 3;//待裝入物品總數量

int weight[n+1] = ;

int value[n+1] = ;

int main()

;//動規的重點,記錄最優子結構的內容

//memset(m, 0, sizeof(m));//初始化為0

//想寫乙個函式來實現,突然發現不會二維陣列引數傳遞

//先寫在主函式中吧,回頭學會了再完善~~

//自頂向下的順序

//首先放置第乙個物品

for(int j = 0; j <= c; j++)

}for(int i = 2; i <= n; i++)

else

}else}}

int x[n+1]=;//回溯找到放了哪幾個物品

int tempc = c;

for(int i = n; i >= 1; i--)

else

}cout

<< "選中的物品為:"

<< endl;

for(int i = 1; i <= n; i++)

}return

0;}

上面寫的是乙個最簡單的01揹包,沒有考慮空間的使用等等,只是實現了完整的動規的想法。

寫完這個**,感覺好像對於演算法導論上的一句話有些明白了,分治法是要把乙個問題分解成許多的子問題,子問題之間是沒有重疊的,動規也是在把問題化小,但是如果用遞迴實現的話,就會解很多重複的子問題。所以最好用自底向上的思想來解題,記錄計算過的子問題,再用到的時候就直接去查詢就可以了。

揹包還是要進一步學習的,以後繼續更新~

經典動規 01揹包

問題描述 給定n個物品,每個物品有乙個重量w和價值v,你有乙個能裝m重量的揹包,問怎麼裝使得所裝價值最大,每個物品只有乙個。如 n 3,m 5,wi vi 結果返回最大價值為 8 首先來填乙個 第一,如果揹包容量比該物品重量小,要不起,此時的價值等於 i 1 j 格中的價值。第二,如果揹包容量可以裝...

演算法學習 01揹包問題

是慕課網的實戰演算法課程 動態規劃 相當於還是求n個物品的組合!暴力解法 每一件物品,都可以放進揹包,也可以不放進。複雜度是o 2 n n 對於每乙個組合,還要看看對應的總重是多少,看看是不是超過了容量c,從而看價值。組合方式都可以用遞迴的方式來求解。只是是能不能找到重疊子問題 最優子結構,從而轉換...

hdu2546飯卡(動規 01揹包)

problem description 電子科大本部食堂的飯卡有一種很詭異的設計,即在購買之前判斷餘額。如果購買乙個商品之前,卡上的剩餘金額大於或等於5元,就一定可以購買成功 即使購買後卡上餘額為負 否則無法購買 即使金額足夠 所以大家都希望盡量使卡上的餘額最少。某天,食堂中有n種菜 每種菜可購買一...