• 贪心算法解决批量开票限额的问题


    具体问题:批量订单开票
    限制:1.开最少的张数 2.每张限额10w

    # 贪心算法
    def split_invoice_by_item(items):
        items_sorted = sorted(items, key=lambda x: x.price, reverse=True)
        invoices = []
        for item in items_sorted:
            # 尝试将商品加入已有的发票中
            added = False
            for invoice in invoices:
                if invoice['total'] + item.price <= 100000:
                    invoice['items'].append(item)
                    invoice['total'] += item.price
                    added = True
                    break
            # 如果无法加入已有的发票中,则创建新的发票
            if not added:
                invoices.append({
                    'total': item.price,
                    'items': [item]
                })
        return invoices
    
    
    class Item:
        def __init__(self, name, price):
            self.name = name
            self.price = price
    
    
    items = [
        Item('item1', 50000),
        Item('item2', 20000),
        Item('item3', 40000),
        Item('item4', 70000),
        Item('item5', 60000),
        Item('item6', 30000),
    ]
    
    invoices = split_invoice_by_item(items)
    print('invoices=====', invoices)
    # 打印所有发票及其商品
    for i, invoice in enumerate(invoices):
        print(f'Invoice{i + 1}:')
        for item in invoice['items']:
            print(f'{item.name}: {item.price}')
        print('-----------------')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46

    以上代码实现了将商品列表按价格从高到低排序,并将商品逐个尝试添加到不同的发票中。如果已有的发票总金额加上当前商品价格不超过 100000 元,则将商品添加至该发票中,并更新该发票的总金额;否则创建新的发票,并将商品添加进去。最终返回所有创建的发票列表。

    具体的实现步骤如下:

    将商品列表按价格从高到低排序,保存为 items_sorted。
    初始化一个空的发票列表 invoices。
    遍历 items_sorted 中的每个商品 item。
    对于当前商品 item,尝试将其加入已有的发票中。
    遍历 invoices 中的每个发票 invoice。
    如果将当前商品添加至该发票不会超过 100000 元,则将商品添加至该发票,并更新该发票的总金额和商品列表。
    如果已有的发票无法接收当前商品 item,则创建新的发票,并将当前商品 item 添加进去。
    返回所有创建的发票列表 invoices。

    贪心算法的劣势:贪心算法的主要缺点是局部最优解并不一定是全局最优解。通常情况下,贪心算法只考虑了当前步骤的最优解,而没有考虑将来的可能性。因此,贪心算法可能会导致最终结果与最优解之间存在较大的差距,特别是在复杂的问题上。

  • 相关阅读:
    温控仪的工作原理
    编码器如何控制单相霍尔电机。只有一路霍尔信号,电机只能正转不能反转。能移植野火Pid控制吗
    leetcode:2347. 最好的扑克手牌(python3解法)
    windows系统重装时,如何将对工作的影响降到最低,实现平滑过渡?
    151. 关于 SAP UI5 XML 视图里控件事件处理函数名称中的 . (点号) 问题的讨论
    (附源码)计算机毕业设计SSM洁强汽车美容
    BUUCTF---misc---[HBNIS2018]来题中等的吧
    IP地址定位的基本原理
    这家公司因Log4j漏洞惨遭黑客攻击并勒索500万美元
    SpringBoot3集成WebSocket
  • 原文地址:https://blog.csdn.net/weixin_43006743/article/details/133786948