貪心演算法 堆 成本與利潤

2022-08-10 08:15:14 字數 1285 閱讀 4463

輸入:

引數1, 正數陣列costs

引數2, 正數陣列profits

引數3,正數k

引數4, 正數m

costs[i]表示i號專案的花費

profits[i]表示i號專案在扣除花費之後還能掙到的錢(利潤)

k表示你不能並行、 只能序列的最多做k個專案

m表示你初始的資金

將每個專案的成本和利潤放到一起,

然後準備乙個大根堆,乙個小根堆

首先小根堆:按照成本的大小排序,然後將成本小於w的專案全部彈出,加入到大根堆中(大根堆是按照利潤的大小進行排序)

然後將大根堆中的頂點值彈出,即是本次選擇的專案,然後本金m增加,k減少一次,繼續下一次

如果小根堆不能彈出專案(成本大於現在的本金)時,繼續從大根堆彈出專案。進行下一次,直到k為0

public class ipo 

}//按照最小成本構建的小根堆中

public static class minheapcomparator implements comparator

}//按照最大收益構建的大根堆中

public static class maxheapcomparator implements comparator

}public int maxprofit(int costs, int profits, int k, int m)

//用來盛放按照當前資金可以承受的範圍內的專案,且按照最大收益構建的大根堆中(從小根堆中彈出的)

priorityqueueitemsbymaxprofit = new priorityqueue<>( new maxheapcomparator() );

//錯誤的迴圈,下面那個是對的

//這個判斷條件有問題,當小根堆中的元素全部入大根堆的佇列中,且還未達到k時,此時就會跳出迴圈,這樣是不對的

while(itemsbymincost.size() > 0 && k > 0)

if(itemsbymaxprofit.isempty() && itemsbymincost.peek().cost > m) break;

if(itemsbymaxprofit.size() > 0)

}//這個迴圈判斷條件是對的,上面那個是不對的

for(int i = 0; i < k; i++)

if(itemsbymaxprofit.isempty()) break;

m += itemsbymaxprofit.poll().profit;

}return m;

}}

經典貪心演算法 貪心演算法概述

貪心演算法具有最優子問題結構,它的特點是 短視 每次選擇對當前局面最有利的決策,來一步步獲得最優解。我個人認為,貪心不是乙個具體的方法,而是一類方法,貪心演算法的關鍵不在於想到,而在於正確性的證明。要證明乙個貪心演算法是正確的,需要證明我們可以把乙個最優解逐步轉化為我們用貪心演算法所得到的解,而解不...

演算法 貪心演算法

把乙個複雜問題分解為一系列較為簡單的區域性最優選擇,每乙個選擇都是對當前解的乙個擴充套件,知道獲得問題的完整解。在解決問題的策略上目光短淺,只根據當前已有的資訊做出選擇,而且一旦做出了選擇,不管將來有什麼結果這個選擇都不會改變。換言之,貪心法並不是從整體最優考慮,它所做出的選擇只是在某種意義上的區域...

演算法 貪心演算法

集合覆蓋問題 旅行商問題等都屬於np完全問題,在數學領域上並沒有快速得到最優解的方案,非常適合用貪婪演算法。判斷方法 1.元素較少時,一般執行速度很快,但隨著元素數量增多,速度會變得非常慢 2.涉及到需要計算比較 所有的組合 情況的通常是np完全問題 3.無法分割成小問題,必須考慮各種可能的情況。這...