满200减30,怎么样用python计算凑单正好满足要求呢?

双十一

凑单问题

一年一度的双十一又到了,在这样一个日子中,可能遇到一些问题,首先是“凑单”问题。比如说,在电商活动中,经常会有“满减”,例如,“满200,减30”,在这样的情况下,我们需要达到目标,或超过目标(因为,未达到目标,是不能进行满减的)。

很显然,如果我们买200元的物品,需要付出170元(相当于85折),而买300元的东西,需要付出270元(相当于9折)。也就是说,我们需要找到一个或多个商品组合,使其价格总和尽可能接近目标金额,且超过目标金额。

积分问题

另外一个常见的问题,是“积分兑换“问题,比如说,账号中有1000积分,可以兑换若干样东西,在这样的情况下,我们需要尽可能的接近目标,但是不能超过目标(因为,超过积分的行为是不被允许的)。

很显然,积分通常有期限,剩余的积分往往不能发挥任何作用。也就是说,我们需要找到一个或多个商品组合,使其价格总和尽可能接近目标积分,但不超过目标积分。

问题解决

解决凑单问题

解决方法:

  1. 假如一个商品列表prices,目标金额target,并且定义一个变量min_excess,用于记录最小的超出金额差值,best_combination用于存储最优组合。
  2. prices中选择每一个商品,计算商品组合的总价格,如果价格超过了target,检查是否是当前最接近的组合。总价格如果未超过target,那么继续添加其他商品。
  3. 最终,得到最优组合best_combination
from itertools import combinationsdef find_best_combination(prices, target):best_combination = Nonemin_excess = float("inf")for i in range(1, len(prices) + 1):for comb in combinations(prices, i):total_price = sum(comb)if total_price >= target and (total_price - target) < min_excess:min_excess = total_price - targetbest_combination = combreturn best_combination, sum(best_combination) if best_combination else 0prices = [66, 33, 24, 89, 77]
target = 200best_combination, best_price = find_best_combination(prices, target)
print(f"最优组合: {best_combination}, 总价: {best_price}")

这里,我们使用了一个工具,itertools库中的combinations,该函数的作用是,生成不重复的元素组合。

# 以[1, 2, 3]为例# 此时的结果为:[(1,), (2,), (3,)]
print(list(combinations([1, 2, 3], 1)))# 此时的结果为:[(1, 2), (1, 3), (2, 3)]
print(list(combinations([1, 2, 3], 2)))# 此时的结果为:[(1, 2, 3)]
print(list(combinations([1, 2, 3], 3)))

解决积分兑换

与凑单问题类似,其实只需要不超过的最接近值即可。

from itertools import combinationsdef find_best_combination(prices, target):best_combination = Nonemax_total = 0for i in range(1, len(prices) + 1):for comb in combinations(prices, i):total_price = sum(comb)if total_price <= target and total_price > max_total:max_total = total_pricebest_combination = combreturn best_combination, max_totalprices = [66, 33, 24, 89, 77]
target = 200best_combination, best_price = find_best_combination(prices, target)
print(f"最优组合: {best_combination}, 总积分: {best_price}")

保存多个结果

有的时候,虽然我们得到了最佳结果,但是,最佳结果并不一定是我们希望的。比如说,最佳结果中,买到的商品,可能并不是我们最满意的,因此,保存多个组合方案,可以提供多种参考。

对于凑单问题:

from itertools import combinations
import heapqdef find_top_combinations(prices, target, top_n=5):heap = []for i in range(1, len(prices) + 1):for comb in combinations(prices, i):total_price = sum(comb)if total_price >= target:excess = total_price - targetheapq.heappush(heap, (-excess, total_price, comb))if len(heap) > top_n:heapq.heappop(heap)top_combinations = sorted(heap, key=lambda x: -x[0])return [(comb[2], comb[1]) for comb in top_combinations]prices = [66, 33, 24, 89, 77]
target = 200
top_n = 5top_combinations = find_top_combinations(prices, target, top_n=top_n)
print(f"最优的{top_n}种组合及其总价:")
for i, (combination, total_price) in enumerate(top_combinations, 1):print(f"组合 {i}: {combination}, 总价: {total_price}")

此时,可以看到结果显示为:

最优的5种组合及其总价:

组合 1: (66, 33, 24, 77), 总价: 200

组合 2: (66, 33, 24, 89), 总价: 212

组合 3: (33, 24, 89, 77), 总价: 223

组合 4: (66, 89, 77), 总价: 232

组合 5: (66, 24, 89, 77), 总价: 256

 对于积分兑换问题:

from itertools import combinations
import heapqdef find_top_combinations(prices, target, top_n=5):top_combinations = []for i in range(1, len(prices) + 1):for comb in combinations(prices, i):total_price = sum(comb)if total_price <= target:if len(top_combinations) < top_n:heapq.heappush(top_combinations, (total_price, comb))else:if total_price > top_combinations[0][0]:heapq.heappushpop(top_combinations, (total_price, comb))top_combinations.sort(reverse=True, key=lambda x: x[0])return [(comb[1], comb[0]) for comb in top_combinations]prices = [66, 33, 24, 89, 77]
target = 200
top_n = 5top_combinations = find_top_combinations(prices, target, top_n=top_n)
print(f"最优的{top_n}种组合及其总价:")
for i, (combination, total_price) in enumerate(top_combinations, 1):print(f"组合 {i}: {combination}, 总价: {total_price}")

此刻可以看到结果显示为:

最优的5种组合及其总价:

组合 1: (66, 33, 24, 77), 总价: 200

组合 2: (33, 89, 77), 总价: 199

组合 3: (24, 89, 77), 总价: 190

组合 4: (66, 33, 89), 总价: 188

组合 5: (66, 24, 89), 总价: 179

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/12603.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

通俗易懂的介绍期权如何开户以及条件与规则!

一文带你了解通俗易懂的介绍期权如何开户以及条件与规则&#xff0c;一般在证券和期货开通期权账户是需要满足基本的验资门槛&#xff0c;而期权平台是可以在线上开通的。具体的期权开户过程可以参考以下几个步骤。 一、期权开户的条件和流程 1. 年龄要求&#xff1a;投资者必…

【go从零单排】Text Templates

&#x1f308;Don’t worry , just coding! 内耗与overthinking只会削弱你的精力&#xff0c;虚度你的光阴&#xff0c;每天迈出一小步&#xff0c;回头时发现已经走了很远。 &#x1f4d7;概念 Go 中的文本模板&#xff08;Text Templates&#xff09;是通过 text/template 包…

mysql 常用命令(二)

1、创建空表 mysql> CREATE TABLE test ( id int(4) NOT NULL AUTO_INCREMENT, name char(20) NOT NULL, PRIMARY KEY (id) ) ENGINEInnoDB DEFAULT CHARSETlatin1;AUTO_INCREMENT&#xff1a;自增&#xff0c;下次插入数据&#xff0c;会自动增加ID的值&#xff0c;…

麦肯锡数字化转型方法论:系统性四步法

在全球范围内&#xff0c;众多企业纷纷投身于数字化转型&#xff0c;对价值链各环节产生深远影响。 数字化转型不仅能够创造价值&#xff0c;提高生产力&#xff0c;还能帮助企业保持竞争优势。 然而&#xff0c;大多数转型都因准备不充分而遭遇失败。 麦肯锡通过对全球上千个…

政企学习考试系统(源码+文档+部署+讲解)

本文将深入解析“政企学习考试系统”的项目&#xff0c;探究其架构、功能以及技术栈&#xff0c;并分享获取完整源码的途径。 系统概述 本项目名称为政企学习考试系统&#xff0c;是一款面向政企用户的在线学习与考试平台。该系统旨在为用户提供便捷、高效的学习和考核服务&a…

Jmeter基础篇(22)服务器性能监测工具Nmon的使用

一、前言 我们在日常做压测的过程中&#xff0c;不仅仅需要监控TPS&#xff0c;响应时间&#xff0c;报错率等这些系统基础性能数据&#xff0c;还需要对服务器的性能&#xff08;如CPU、磁盘、内存、网络IO等&#xff09;做监控&#xff0c;以求对系统运行过程中的硬件性能有…

三级等保安全解决方案,实施方案,整改方案(Word,PPT等相关资料学习)

信息系统进行三级等保的主要原因在于保障信息安全&#xff0c;维护国家安全和公共利益。三级等保是我国根据相关法律法规制定的信息安全等级保护制度中的一部分&#xff0c;旨在确保信息系统的完整性、可用性和保密性。通过三级等保&#xff0c;信息系统可以得到一系列的安全保…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录&#xff1a;★★★★尤其注意&#xff1a;引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录&#xff1a; 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

老破机器硬盘要坏,转移虚拟机里的打字平台过程全记录

我有一台老破机器&#xff0c;说破其实没多破&#xff0c;但是老应该是有几年了&#xff0c;这机器一开始一直放在领导办公室不让人用&#xff0c;后来因为单位整体搬迁&#xff0c;我跟领导讨了来&#xff0c;win10的系统&#xff0c;我装了个虚拟机好像是15的版本&#xff0c…

光流法与直接法在SLAM中的应用

本文总结视觉SLAM中常用的光流法与直接法 1、Lucas-Kanade光流法 相机所拍摄到的图像随相机视角的变化而变化&#xff0c;这种变化也可以理解为图像中像素的反向移动。“光流”&#xff08;Optical Flow&#xff09;是指通过分析连续图像帧来估计场景中像素或特征点的运动的技…

VPN相关学习笔记

目录 VPN IPSec AH ESP IKE 工作流程 SSL SSL协议 握手协议 记录协议 警告协议 非对称密钥协商过程 SSL VPN工作 两种技术对比 VPN 介绍&#xff1a;VPN创建了一个专用隧道&#xff0c;用于安全地传输数据。Internet协议安全&#xff08;IPSec&#xff09;和安全套…

通过条件访问策略增强企业的安全性

在当今的数字时代&#xff0c;保护组织的数据比以往任何时候都更加重要&#xff0c;实现这一目标的一种方法是实施条件访问策略。这些策略有助于管理谁可以访问组织的网络&#xff0c;确保只有经过授权的人员才能通过&#xff0c;它们可以充当组织数据的保安&#xff0c;只让符…

二叉树搜索树(上)

二叉树搜索树&#xff08;上&#xff09; 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一颗空树&#xff0c;或者是具有以下性质的二叉树: • 若它的左子树不为空&#xff0c;则左子树上所有结点的值都⼩于等于根结点的值 • 若它的右子树不为空&#xff0c;则右子树…

人群计数制作私有数据集教程-----自用

一、人群计数的数据集包括两部分&#xff1a;图像部分和标签部分 1.公开数据集格式 标签部分主要包括每个人头的坐标点&#xff1a;&#xff08;x, y&#xff09;&#xff1b; 常见的标签格式例如&#xff1a;ShanghaiTech数据集中的格式&#xff0c;用mat文件存储每个人头的坐…

SpringBoot项目快速打包成jar项目与部署

上文中,tomcat配置完成了。接下来我们需要将我们的项目打包部署至tomcat服务器。 传统的Web应用进行打包部署时,通常会打成War包的形式,然后将War包部署到Tomcat等服务器中,而SpringBoot应用使用的是嵌入式Servlet容器,也就是说,SpringBoot应用默认是以jar包形式进行打包…

【YOLOv8图像分类】YOLOv8图像分类源代码

前言 此程序是使用YOLOv8训练自己的图像并测试。Yolo系列模型可以说是比较特殊的模型&#xff0c;因为不像其他公开网络ResNet、GoogLeNet等等&#xff0c;可以自己构建和更改层。Yolo只能整体调用这个网络&#xff0c;这个可能是让初学者比较头疼的问题&#xff0c;就是看不到…

【干货】金融数据分析:风险评估中的数据分析

风险评估中的数据分析 金融风险评估因是金融行业的核心任务之一&#xff0c;也是保障金融稳定和机构可持续发展的关键。在当今数字化时代&#xff0c;数据分析已经成为金融风险评估的有力武器&#xff0c;能够帮助我们拨开复杂现象的迷雾&#xff0c;洞察风险的本质。 金融风…

【Hadoop】【hdfs】【大数据技术基础】实验三 HDFS Java API编程实践

实验三&#xff1a; HDFS Java API编程实践 实验题目 HDFS Java API编程实践 实验目的 熟悉HDFS操作常用的Java API。 实验平台 操作系统&#xff1a;Linux Hadoop版本&#xff1a;2.6.0或以上版本 JDK版本&#xff1a;1.6或以上版本 Java IDE&#xff1a;Eclipse 实验…

第R3周:RNN-心脏病预测(TensorFlow版)

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营]中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊]** &#x1f37a; 要求&#xff1a; 找到并处理第8周的程序问题&#xff08;本文给出了答案&#xff09;了解循环神经网络&#xff08…

数据结构 ——— 链式二叉树oj题:将链式二叉树的前序遍历存放在数组中

题目要求 给你二叉树的根节点 root &#xff0c;返回它节点值的 前序 遍历 手搓一个链式二叉树 代码演示&#xff1a; // 数据类型 typedef int BTDataType;// 二叉树节点的结构 typedef struct BinaryTreeNode {BTDataType data; //每个节点的数据struct BinaryTreeNode* l…