算法实现之贪心法

最优装载问题

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
x111
x251
x3141
x4181

若使用贪心法,价值大的硬币优先找付,则结果为x4+2*x2,总重量3,但实际上,最优解为2*x3,总重量为2所以贪心法造成的误差为1。若有面值更大的硬币,误差可能进一步加大。

本文仅为学习记录,如有错误欢迎指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值