部分背包问题、Huffman编码、活动选择
提出贪心策略:观察问题特征,构造贪心选择
证明策略正确:假设最优方案,通过替换证明
1 部分背包
按性价比大小从小到大排序,先选择性价比高的物品;
def F_Knapsack(n,p,v,C)
{
把所有物品按照价值/体积的比升序; //排序时间复杂度nlogn
i = 1;
ans = 0;
while(C>0 and i<=n) {
if(v[i] <= C) {
ans += p[i];
C -= v[i];
}
else {
ans += C*(p[i]/v[i]);
C = 0;
}
i = i + 1;
}
return ans;
}
时间复杂度\(O(nlogn)\)
2 Huffman编码
def Huffman(F, n)
{
将F按递增排序; // 排序
新建节点数组P[1..n], Q[1..n];
for(i=1 to n) {
P[i].freq = F[i];
P[i].left = NULL;
P[i].right = NULL;
}
Q = {};
for(i=1 to n) {
x = Extract(P, Q);
y = Extract(P, Q);
z.freq = x.freq + y.freq;
z.left = x;
z.right = y;
Q.add(z);
}
return Extract(P, Q);
}
时间复杂度为:\(O(nlogn)\)
3 活动选择问题
想要选择尽可能多的活动,每次选择最早完成时间的项目
def ActivitySelection(S{a1, a2,..., an}, s[1..n], f[1..n])
{
把所有活动按完成时间升序排序;
Ans = {a1};
k = 1;
for(i=2 to n) {
if(si >= fk) {
k = i; //更新为当前的活动
Ans = Ans + {ai}
}
}
return Ans;
}
时间复杂度\(O(nlong)\)
原文:https://www.cnblogs.com/VanHa0101/p/14197373.html