貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。(區域性最優解,而不是整體最優解)
貪心演算法沒有固定的演算法框架,演算法設計的關鍵是貪心策略的選擇。必須注意的是,貪心演算法不是對所有問題都能得到整體最優解,選擇的貪心策略必須具備無後效性(即某個狀態以後的過程不會影響以前的狀態,只與當前狀態有關。)所以,對所採用的貪心策略一定要仔細分析其是否滿足無後效性。
把求解的問題分成若干個子問題
對每個子問題求解,得到子問題的區域性最優解(不能保證求得的最後解是最佳的)
把子問題的解區域性最優解合成原來問題的乙個解
可以看出貪心演算法和動態規劃非常相似,但是兩者存在部分區別
1)貪心演算法每一步的最優解一定包含上一步的最優解,上一步之前的最優解則不作保留。而動態規劃全域性最優解中一定包含某個區域性最優解,但不一定包含前乙個區域性最優解,因此需要記錄之前的所有的區域性最優解。
2)貪心演算法只能求滿足某些約束條件的可行解的範圍。
3)貪心不能保證求得的最後解是最佳的,一般複雜度低。而動態規劃本質是窮舉法,可以保證結果是最佳的,複雜度高。
1)指定幣值和相應的數量,用最少的數量湊齊某金額
思路:優先選擇面值大的錢幣,以此類推,直到湊齊總金額
public int getcoinnum(int sum, int values, int counts) add = add + num * values[i]; result[i] = num; } return result;}
2)部分揹包問題,物品可以不完全放入包中,求價值最大的方案
思路:選擇單位重量價值最高的物品,將盡可能多的該物品裝入揹包,直到揹包裝滿為止。
貪心法 選取當前最優策略
貪心的特點是選取當前最優策略,這也帶來了缺點,當前的最優解不一定是最終的最優解。1.硬幣問題 有1元 5元 10元 50元 100元 500元的硬幣各c1 c5 c10 c50 c100 c500枚。現在要用這些硬幣來支付a元,最少需要多少枚硬幣?假定本題至少存在一種支付方案。樣例輸入 3 2 1 ...
用貪心演算法求最優解
題目 有 m 元錢,n 種物品 每種物品有 j 磅,總價值 f 元,可以 使用 0 到 f 的任意 購買相應磅的物品,例如使用 0.3f 元,可以購買 0.3j 磅物 品。要求輸出用 m 元錢最多能買到多少磅物品 演算法思想 每次都買價效比最高的產品,價效比的計算公式為 重量 價效比的含義為用最少的...
最優分解問題(C語言) 貪心策略
題目描述 設n是乙個正整數,現在要求將n分解為若干個互不相同的自然數的和,使這些自然數的乘積最大。解題思路 根據數學中和定近積大,積定近和小的原則,可得 1 若a b等於乙個常數,則 a b 越小,a b就越大。要使得加數互不相同,又盡可能集中,那加數只能是連續的自然數了。2 乙個數能分解,分解後乘...