貪心演算法(又稱貪婪演算法)是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。
貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態,只與當前狀態有關。 [1]
1、現有乙個字元陣列,將字元陣列中的所有字串拼接起來,使得到的字串字典序最小。
思路:使前兩個拼接起來字典序最小,依次向後遍歷。
注意:並不一定是字典序小的在前邊,大的在後邊,比如 , }, 顯然並不是bba最小,而是bab。
public static string method(string strings)
};arrays.sort(strings, comparator);
stringbuilder stringbuilder = new stringbuilder();
for (string string : strings)
return stringbuilder.tostring();
}
2、一塊金條切成兩半,是需要花費和長度數值一樣的銅板的。比如長度為20的金條,不管切成長度多大的兩半,都要花費20個銅板。一群人想整分整塊金 條,怎麼分最省銅板?
例如,給定陣列,代表一共三個人,整塊金條長度為10+20+30=60. 金條要分成10,20,30三個部分。
如果, 先把長度60的金條分成10和50,花費60 再把長度50的金條分成20和30,花費50 一共花費110銅板。
但是如果, 先把長度60的金條分成30和30,花費60 再把長度30金條分成10和20,花費30 一共花費90銅板。
輸入乙個陣列,返回分割的最小代價
思路:哈夫曼樹問題
每次取出現有資料中最小的兩個數。
public static int method(int arr)
int res = 0;
while (priorityqueue.size() > 1)
return res;
}
3、ipo問題
現有兩個陣列cost[m],profile[m]分別為 1~m-1 號專案的花費資金與完成專案後的純利潤。你的起始資金為n,你最多只能投資k個專案,同一時間只能投資乙個專案。求你經過一段時間後最多所擁有的資金數。
思路:貪心:每次投資現有資金所能投資的收益最大的專案。
//專案類
static class note
}public static int method(int cost, int profile, int k, int n)
//比較器,分別按cost從小到大,profile從大到小排列
priorityqueuecostminpq = new priorityqueue<>((note1, note2) -> note1.cost - note2.cost);
priorityqueuepromaxpq = new priorityqueue<>((note1, note2) -> note2.profile - note1.profile);
//將所有note新增到costminpq優先佇列中
for (note note : notes)
while (k-- > 0)
if (promaxpq.isempty())
//此時promaxpq中彈出的就是當前資金所能作的收益最大的專案
n += promaxpq.poll().profile;
}return n;
}
4、一些專案要占用乙個會議室宣講,會議室不能同時容納兩個專案的宣講。 給你每乙個專案開始的時間和結束的時間(給你乙個陣列,裡面 是乙個個具體的專案),你來安排宣講的日程,要求會議室進行 的宣講的場次最多。返回這個最多的宣講場次。
思路:貪心,優先選擇當前時間所能開的會議中,完成時間最早的。
public static int method(note notes)
}return res;
}
貪心演算法例項
問題描述 馬的遍歷問題。在 方格的棋盤上,從任意指定方格出發,為馬尋找一條走遍棋盤每一格並且只經過一次的一條路徑。傳統演算法 首先這是乙個搜尋問題,運用深度優先搜尋進行求解。演算法如下 輸入初始位置座標 x,y 步驟c 如果 c 64 輸出乙個解,返回上一步驟 c x,y c 計算 x,y 的八個方...
貪心演算法例項
有一批貨櫃要裝上一艘載重量為c的輪船。其中貨櫃i的重量為w。最優裝題要求確定在裝載體積不受限制的情況下,將盡可能多的貨櫃裝上輪船。該問題可形式化描述為 其中,變數xi 0表示不裝入貨櫃i,xi 1表示裝入貨櫃i。演算法描述 最優裝載問題可用貪心演算法求解,採用重量最輕者先裝的貪心選擇策略,可產生最優...
經典貪心演算法 貪心演算法概述
貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...