貪婪法是一種不追求最優解,只希望得到較為滿意解的方法。貪婪法一般可以快速得到滿意的解,因為它省去了為找最優解要窮盡所有可能而必須耗費的大量時間。貪婪法常以當前情況為基礎作最優選擇,而不考慮各種可能的整體情況,所以貪婪法不要回溯。
例如平時購物找錢時,為使找回的零錢的硬幣數最少,不考慮找零錢的所有各種發表方案,而是從最大面值的幣種開始,按遞減的順序考慮各幣種,先盡量用大面值的幣種,當不足大面值幣種的金額時才去考慮下一種較小面值的幣種。這就是在使用貪婪法。這種方法在這裡總是最優,是因為銀行對其發行的硬幣種類和硬幣面值的巧妙安排。如只有面值分別為1、5和11單位的硬幣,而希望找回總額為15單位的硬幣。按貪婪演算法,應找1個11單位面值的硬幣和4個1單位面值的硬幣,共找回5個硬幣。但最優的解應是3個5單位面值的硬幣。
【問題】 裝箱問題
問題描述:裝箱問題可簡述如下:設有編號為0、1、…、n-1的n種物品,體積分別為v0、v1、…、vn-1。將這n種物品裝到容量都為v的若干箱子裡。約定這n種物品的體積均不超過v,即對於0≤i<n,有0<vi≤v。不同的裝箱方案所需要的箱子數目可能不同。裝箱問題要求使裝盡這n種物品的箱子數要少。
若考察將n種物品的集合分劃成n個或小於n個物品的所有子集,最優解就可以找到。但所有可能劃分的總數太大。對適當大的n,找出所有可能的劃分要花費的時間是無法承受的。為此,對裝箱問題採用非常簡單的近似演算法,即貪婪法。該演算法依次將物品放到它第乙個能放進去的箱子中,該演算法雖不能保證找到最優解,但還是能找到非常好的解。不失一般性,設n件物品的體積是按從大到小排好序的,即有v0≥v1≥…≥vn-1。如不滿足上述要求,只要先對這n件物品按它們的體積從大到小排序,然後按排序結果對物品重新編號即可。裝箱演算法簡單描述如下:
else
將物品i放入箱子j;}}
上述演算法能求出需要的箱子數box_count,並能求出各箱子所裝物品。下面的例子說明該演算法不一定能找到最優解,設有6種物品,它們的體積分別為:60、45、35、20、20和20單位體積,箱子的容積為100個單位體積。按上述演算法計算,需三隻箱子,各箱子所裝物品分別為:第一只箱子裝物品1、3;第二隻箱子裝物品2、4、5;第三隻箱子裝物品6。而最優解為兩隻箱子,分別裝物品1、4、5和2、3、6。
若每只箱子所裝物品用鍊錶來表示,鍊錶首結點指標存於乙個結構中,結構記錄尚剩餘的空間量和該箱子所裝物品鍊錶的首指標。另將全部箱子的資訊也構成鍊錶。以下是按以上演算法編寫的程式。
}附php示例:
<?php //物品
$items[0] = 60;
$items[1] = 45;
$items[2] = 35;
$items[3] = 20;
$items[4] = 20;
$items[5] = 20;
$box_volume_count = 100; //每個盒 子的最大容積
$box_count = 0; //共用盒子總數
$item_count = count( $items );
$box = array();//盒 子陣列
for ( $itemindex = 0; $itemindex < $item_count; $itemindex++ )
}if ( $_box_index === false ) else
}print_r( $box );
?>
執行結果:
array
( [0] => array
([volume] => 95
[items] => array
([0] => 0
[1] => 2
&nbs程式設計客棧p; )
)[1] => array
([volume] => 85
[items] => array
([0] => 1
&程式設計客棧nbsp; [1] => 3
[2] => 4))
[2] => array
([volume] => 20
[items] => array
([0] => 5))
PHP實現的折半查詢演算法示例
定義 折半查詢技術,也就是二分查詢。它的前提是線性表中的記錄必須是關鍵碼有序 通常從大到小有序 線性表必須採用順序儲存。折半查詢的基本思想 取中間記錄作為比較物件,若給定值與中間記錄的關鍵字,則在中間記錄的關鍵字相等,則查詢成功 若給定值小於中間記錄的作伴去繼續查詢 若給定值大於中間記錄的關鍵字,則...
貪婪演算法實現裝箱
貪婪演算法實現裝箱操作 public class test 裝箱函式 public void putthehuowu huowu h int num 1 box box null for int i 0 i h.length i boolean isok false box currentbox b...
PHP實現的XXTEA加密解密演算法示例
xxtea 加密實現類 class xxtea s array for i 0 i len 程式設計客棧 i s i pack v v i return w substr implode s 0,n implode s private function str2long s,w private fu...