最优装载问题
n 个集装箱1, 2, … , n 装上轮船,集装箱i的重量wi, 轮船装载重量限制为C,无体积限制。如何装使得上船的集装箱最多?每个箱子的重量wi<C。
本质是一种0-1背包问题。
def load_ship(weights, capacity):
# 按照集装箱的重量进行排序
weights.sort()
l = []
total_weight = 0 # 记录已装上轮船的总重量
for weight in weights:
# 如果当前集装箱的重量加上已装上轮船的总重量不超过载重量限制
if weight + total_weight <= capacity:
total_weight += weight
l.append(weight)
else:
break # 超过载重量限制,退出循环
return l
Java:
public static List<Integer> load_ship(int[] weights, int capacity)
{
// 按照集装箱的重量进行排序
Arrays.sort(weights);
List<Integer> l = new ArrayList<>();
int total_weight = 0; // 记录已装上轮船的总重量
for (int weight : weights)
{
// 如果当前集装箱的重量加上已装上轮船的总重量不超过载重量限制
if (weight + total_weight <= capacity)
{
total_weight += weight;
l.add(weight);
} else
{
break; // 超过载重量限制,退出循环
}
}
return l;
}
最小延迟调度
有若干任务,有若干资源,求一种调度方案,使得任务总延时最小。
def min_delay_scheduling(tasks, resources):
# 将任务按照截止时间排序
sorted_tasks = sorted(tasks, key=lambda x: x[1])
# 初始化资源池
resource_pool = [0] * resources
# 遍历所有任务
total_delay = 0
for task in sorted_tasks:
start_time = task[0]
deadline = task[1]
# 找到可用的资源
resource_index = -1
for i in range(resources):
if resource_pool[i] <= start_time:
resource_index = i
break
# 如果找不到可用资源,则将任务延迟
if resource_index == -1:
total_delay += 1
else:
resource_pool[resource_index] = deadline + 1
return total_delay
贪心法的得不到最优解的处理
1.分析参数在什么取值时候可以得到最优解
2.估计贪心法在最坏情况下与最优解的误差
找零钱问题
设有n 种零钱,重量分别为w1,w2, ... , wn, 价值分别为v1 = 1, v2, ... vn., 需要付的总钱数是y. 币值和钱数都为正整数。 问:如何付钱使得所付钱的总重最轻?
一个得不到最优解的例子
编号 | 价值v | 重量w |
x1 | 1 | 1 |
x2 | 5 | 1 |
x3 | 14 | 1 |
x4 | 18 | 1 |
若使用贪心法,价值大的硬币优先找付,则结果为x4+2*x2,总重量3,但实际上,最优解为2*x3,总重量为2所以贪心法造成的误差为1。若有面值更大的硬币,误差可能进一步加大。
本文仅为学习记录,如有错误欢迎指出。