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

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

python 复制代码
# 贪心算法
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('-----------------')

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

具体的实现步骤如下:

将商品列表按价格从高到低排序,保存为 items_sorted。

初始化一个空的发票列表 invoices。

遍历 items_sorted 中的每个商品 item。

对于当前商品 item,尝试将其加入已有的发票中。

遍历 invoices 中的每个发票 invoice。

如果将当前商品添加至该发票不会超过 100000 元,则将商品添加至该发票,并更新该发票的总金额和商品列表。

如果已有的发票无法接收当前商品 item,则创建新的发票,并将当前商品 item 添加进去。

返回所有创建的发票列表 invoices。

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

相关推荐
代码山河5 小时前
Python就业方向全解析:后端、爬虫、数据分析、AI你选哪个?
python·学习·架构·教程·面向对象·项目
在世修行5 小时前
智学文枢:题目流水线
python·多线程·状态机·pyside
梯度下降者6 小时前
零基础入门Python 爬虫
爬虫·python·数据分析·入门指南·webcrawler
UIU1148 小时前
P1233 [ICPC 2001 Taejon R] 木棍加工
数据结构·c++·算法·动态规划
“AI国潮设计-小江”8 小时前
【AIGC实战】Python+Stable Diffusion打造“英歌舞财神”IP,解锁“马到成功”等爆款情绪营销文案设计
开发语言·人工智能·python·prompt·aigc
论文复现现场8 小时前
WRF、FEA 能用 L40S 加速吗?求解器检查、断点恢复与长期运行
java·数据库·算法·wrf·有限元分析·gpu计算·断点续算
ZhengEnCi8 小时前
用 AI 写代码为什么拼到最后还是拼人:算力瓶颈与领域专家提示词的本质差异
算法·架构
benchmark_cc9 小时前
用 Python 拉 A 股全市场实时快照:Notebook 请求、结果校验与易错点
python·数据分析·pandas·量化交易·股票数据·quantdash
伞伞悦读9 小时前
【第70期】Adam二阶矩不是方差:偏差校正、动量与AdamW完整实验
python
秋天的怀念_David9 小时前
第二十一夜 · 数字黑洞与西西弗斯的惩罚
java·程序人生·算法