基礎演算法之貪心法1

2021-09-30 10:32:49 字數 1970 閱讀 8250

1.2貪心法(1)

在某些情況下區域性最優選擇能得出全域性最優解。如下。

例1.刪數問題

int main()

if(max==0)

(weight[0]不使用)

價值分別為value[6]  (value[0]不使用)

要求總重量不超過12。

我們先建立乙個陣列,array[6][12]

array[m][n]表示標號為m及標號大於m的物品允許放入揹包中,如果重量不超過n,那麼最好的狀況總價值是多少。

如array[3][7]表示3號4號5號允許放入揹包中,重量不超過8時,最好狀況總價值死多少。觀察得最好是把4號和5號放進去,總重量6(小於7),總價值應該是11。所以array[3][7]=11;

有個規律,array[m][n]=max即考慮m號物品要不要放進去,不放進去的狀況總價值=array[m+1][n],放進去總價值=array[m+1][n-weight[m]] +value[m]。

void create_knapsack() //建立物品

cout

}void resolve_knapsack() //解決揹包問題

for(int j=0;j<=container;j++)

for(int m=num-1;m>0;m--)

}}bool * trace_back() //回溯,找哪些物品被放進揹包中了

(0<=k*weight[m]<=n )

對其可以進行優化,把它變為一維的。

for i: container...1

array[n]=max

就是相當於把0-1揹包化成一維的,每次都覆蓋前面那次的結果。

#include #include #include#include #include "stdlib.h"

using namespace std;

typedef struct

knapsack;

knapsack * knapsack;

int num;

int container;

int *array=null;

void create_knapsack() //建立物品

cout

}void resolve_knapsack() //解決揹包問題

}for(int i=1;i<=container;i++)cout

return ;

}int main()

knapsack;

knapsack * knapsack;

int num;

int container;

int *array=null;

void create_knapsack() //建立物品

cout

}void sort_knapsack()}}

}float resolve_knapsack(int *used) //解決揹包問題

{ int left=container;

float value=0;

for(int i=1;i<=num;i++)

{if(knapsack[i].weight

演算法 貪心法

動態規劃在某一步決定優化函式的最大或者最小值時候,需要考慮子問題的優化函式值,從中選出最優的結果。貪心法 也是多不判斷,不考慮子問題的計算結果,根據當時情況採取 只顧眼前的 貪心策略決定取捨,工作量少於動態規劃很多,更具效率 可導致區域性最優化而不是全域性優化 n項活動,使用同乙個禮堂問題 si 和...

演算法 貪心法

感謝華北電力大學王墨玉老師的ppt 基礎知識 應用條件 最優子結構性質 原問題包含了其子問題的最優解 對於乙個問題可能會有不同的量度標準,選擇其中可以獲得最優解的量度標準是貪心法設計的核心問題 例題活動安排問題 可求得最優解 int greedyselector int s,int f,int a ...

演算法學習之貪心法

貪心法是在對問題進行求解時,只做出在當前情況下最好的解,即區域性最優解 而動態規劃是整體最優解 建立數學模型,來描述問題 把問題分解成若干個子問題 對每一子問題求解,得到子問題區域性最優解 把每乙個子問題的區域性最優解合併成乙個解 有n個需要在同一天使用同乙個教室的活動a1,a2,an,教室同一時刻...