貪心演算法(greedy)分階段地工作,在每乙個階段都可以認為所做的決定是最好的,而不用考慮後果。這就意味著得到的是區域性最優解決方案,當演算法結束時,如果乙個乙個區域性最優解能組成全域性最優解決,那麼就說明這個演算法是正確的;如果不是,則此演算法的到的結果就是乙個次優解。因此,如果使用貪婪演算法得到問題的最優解,那麼問題就必須滿足一定的條件。
這個問題在我們的日常生活中非常普遍了。假設1元、2元、5元、10元、20元、50元、100元的紙幣。現在要用這些錢來支付k元,至少要用多少張紙幣?用貪心演算法的思想,很顯然,每一步盡可能用面值大的紙幣即可。在日常生活中我們自然而然也是這麼做的。在程式中已經事先將value按照從大到小的順序排好,第一次我們先取面值最大的,然後取次大的。。。。。。每次取都是從面額最大的開始取,獲得區域性最優解,而最終獲得全域性最優解。**如下:
public
class greedy else
}return result;
} public
static
void
main(string args) ;
listchange = greedy.change(money, limit);
for (integer integer : change)
}}/*
5020205
1*/
我們知道三種最基本的揹包問題:零一揹包,部分揹包,完全揹包。很容易證明,揹包問題不能使用貪心演算法。然而我們考慮這樣一種揹包問題:在選擇物品i裝入揹包時,可以選擇物品的一部分,而不一定要全部裝入揹包。這時便可以使用貪心演算法求解了。計算每種物品的單位重量價值(價效比)作為貪心選擇的依據指標,選擇單位重量價值最高的物品,將盡可能多的該物品裝入揹包,依此策略一直地進行下去,直到揹包裝滿為止。
class
goods
listcommonpackage( int w, int p, int m )
// 對價效比從高到低排序
collections.sort(goodss, new comaprator()
});// 剩餘重量
int rest = m;
int i;
// 存放結果
listresults = new arraylist<>();
for(i=0; iget(i).w )
break;
goods curgoods = goodss.get(i);
results.add(curgoods);
rest -= curgoods.w;
}// 計算最後乙個物體能放入的部分
goods lastgoods = goodss.get(i);
results.add(new goods(lastgoods.id,rest,(lastgoods.p*rest/lastgoods.w));
}
只有一艘船,能乘2人,船的執行速度為2人中較慢一人的速度,過去後還需乙個人把船划回來,問把n個人運到對岸,最少需要多久。區域性最優解是這樣的:將最快的和次快的繫結在一起,然後最快的划船回來;再將最快的和次次塊的一起,然後最快的回來。這樣我們可以知道,這些區域性最優解組成了全域性最優解。證明如下:假設序號為i的人划船時間為ti,那麼總時間=划船回來的時間+划船過去的時間,也就是t1+t2+。。。+tn+划船回來的時間。划船回來的總時間最短為n*最快的人的時間。
這裡我寫一下偽**:
//從時間上從快到慢排序
arrays.sort(t[n]);
for i=1 to n-1;
//計算去的時間
sum + = t[i];
//計算回來的時間
back = (n-1)*t[0];
totaltime = sum+back;
我認為貪心演算法其實是一種策略,對於某個問題使用某種策略去求得最優解。做題的時候,首先需要更具題目來判斷,是否可以使用貪心演算法來解決,判斷依據就是:區域性最優解是否能組成全域性最優解決。如果能,就需要指定求區域性最優解的策略,也就是選擇的依據。是按照面值最大的先先選;還是按照速度最快的先走;亦或是按照價效比最高的先買? 貪心演算法例題
牛牛舉辦了一次程式設計比賽,參加比賽的有3 n個選手,每個選手都有乙個水平值a i.現在要將這些選手進行組隊,一共組成n個隊伍,即每個隊伍3人.牛牛發現隊伍的水平值等於該隊伍隊員中第二高水平值。例如 乙個隊伍三個隊員的水平值分別是3,3,3.那麼隊伍的水平值是3 乙個隊伍三個隊員的水平值分別是3,2...
貪心演算法例題
貪心演算法 移除k個數字 1 題目描述 給定乙個以字串表示的非負整數 num,移除這個數中的 k 位數字,使得剩下的數字最小。注意 num 的長度小於 10002 且 k。num 不會包含任何前導零。2 題目分析 題目簡介明了,就是把給定的數字刪除指定個數的數字使刪除之後的數字是同等位數數字中最小的...
貪心演算法例題
例1 均分紙牌 int main printf 各堆紙牌的數量為 n intm for m 0 m n m printf d t a m printf n v v n printf 每堆牌的平均數為 d n v for i 0 i n 1 i printf 一共移動了 d步。n s printf 現...