演算法導論之貪心演算法

2022-09-02 20:27:09 字數 965 閱讀 5454

參考:

下面請看示例題:

有n個商品,每個商品的重量為wi,**為:pi,現有乙個揹包,最多能裝m的重量.其中(0<=i問:怎樣裝能使包中裝入的商品價值最高(對於每個商品可以只裝該商品的一部分)

偽**:

引數分別為 n:物品數   m:揹包最多能裝的重量   v:價值陣列   w重量陣列

void knapsack(int n,float m,float v,float w,float x)

sort(n,v,w);     //進行排序

int i;

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

x[i] = 0;

float c=m;    //c為揹包剩餘空間

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

if (w[i] > c) break;

x[i]=1;   //選取第i個物品

c-=w[i];    //剩餘重量減少

if (i <= n)  //當此時揹包的容量不夠存放整個物品的情況時,存放一部分

x[i]=c / w[i];

具體**如下:

view code

演算法knapsack的主要計算時間在於將各種物品依其單位重量的價值從大到小排序。若不計較排序的是時間,單單貪心策略的演算法複雜度只有o(n),上面的這個例子使用了o(n*n)的排序演算法,這裡只是為了簡單而已,實際上我們可以選擇合適的排序演算法將排序部分的複雜度降到o(nlgn)..如堆排序,快速排序等等

這裡我沒有記錄完整的例子完全是因為這個演算法太好理解了 ,貪心演算法一般在開始策略選擇前會進行排序,排好序後就進行最優化選擇,這和我們生活中找錢的規律是一樣的,如我需要找87塊錢給顧客,我會怎麼做,首先我們知道10〉5>1這個排序,然後更具我們的經驗,我們出具8張10塊(最大化貪心原則)然後出具 一張5塊,最後出具兩張一塊.當然你也可以說,我全部給一塊或者給不給10塊只給5塊和1塊,但是,那不是最簡便的方法,細心一下,生活中處處是演算法

演算法導論 貪心演算法之赫夫曼編碼

討論赫夫曼編碼問題,赫夫曼編碼的思想就是變長編碼。變長編碼就是讓字元表中出現概率高的字元的編碼長度盡可能小,而出現概率高的字元的編碼長度相對較長。然後還要遵循字首碼的要求,就是任意乙個編碼都不是其他編碼的字首碼,這樣方便解碼。對於下表中的字元和相應的出現概率,有對應圖中的編碼樹 可以比較容易的看出來...

演算法導論 13 貪心演算法

與動態規劃類似,貪心演算法也將問題化簡為規模較小的子問題,並通過遞迴解決子問題來獲取整個問題的解。不同的是,貪心問題不對子問題進行比較,而是只生成乙個非空的子問題,而使選擇在當時看上去是最優的 即 貪心 的含義 幾個互相競爭的活動都要求以獨佔的方式占用某個公用資源 如選修課程對個人可支配時間的要求,...

貪心演算法 1 演算法導論 21

我們先來看看乙個適應貪心演算法求解的問題 選擇活動問題。假定有乙個 n 個活動的集合 s 每個活動 a i 的舉辦時間為 s i,f i 0 leqslant s i f i 並且假定集合 s 中的活動都已按結束時間遞增的順序排列好。由於某些原因,這些活動在同一時刻只能有乙個被舉辦,即對於任意兩個活...