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,教室同一時刻...