ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: gxb0717

[分享] 用PQ来解决凑数问题。

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-10-25 19:09 | 显示全部楼层

最难的几个函数基本都汇集在了这个例子

TA的精华主题

TA的得分主题

发表于 2021-12-8 11:16 来自手机 | 显示全部楼层
楼主,错误提示:5参数传递到了一个函数,该函数应介于2和4之间。

TA的精华主题

TA的得分主题

发表于 2021-12-20 16:50 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-12-20 17:09 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2021-12-23 17:35 | 显示全部楼层
这个数据多了,超级慢,如果是有序列表,算法上会不会优化?

TA的精华主题

TA的得分主题

发表于 2022-5-23 09:09 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
看起来好复杂,EXCEL自带的 规划求解可以完成,或者E灵的 智能凑数  也可完成。

TA的精华主题

TA的得分主题

发表于 2022-5-23 09:33 | 显示全部楼层
这是个算法题,如果数据多了, 你这种算法慢的一比!
算法中的动态规划 专门解决此类问题的!

TA的精华主题

TA的得分主题

发表于 2022-5-24 11:40 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
用python自己的方法 写了一个通过列表,和需要得到的数据,性能比一般的是要快点,数字越大几乎成指数增加,不知道有没有更改的方法,动态规划除外。
  1. import time
  2. global prelst
  3. global prelst
  4. reslst = []
  5. prelst = []

  6. def seachbi(li, val):
  7.     left = 0
  8.     right = len(li)-1
  9.     maxli = li[-1]
  10.     minli = li[0]
  11.     if val>maxli or val<minli:
  12.         return None
  13.     else:
  14.         while left<=right:
  15.             mid = left+(right-left)//2
  16.             if li[mid]==val:
  17.                 return mid
  18.             elif li[mid]>val:
  19.                 right = mid-1
  20.             else:
  21.                 left = mid+1
  22.         else:
  23.             return None         
  24.         

  25. def listSumEqual(prelst, lst, equalsum,num):
  26.     if num ==1:
  27.         if seachbi(lst,equalsum) != None:
  28.             templst = prelst.copy()
  29.             new = lst[seachbi(lst,equalsum)]            
  30.             templst.append(new)
  31.             reslst.append(templst)
  32.     elif num == 2:
  33.         for i in range(len(lst)-1):
  34.             templst = prelst.copy()
  35.             templst.append(lst[i])
  36.             equalsuma = equalsum - sum(templst)            
  37.             seresult = seachbi(lst[i+1:],equalsuma)
  38.             if seresult != None:
  39.                 new = lst[i+1:][seachbi(lst[i+1:],equalsuma)]
  40.                 templst.append(new)
  41.                 reslst.append(templst)
  42.             else:
  43.                 break
  44.     else:
  45.         for i in range(len(lst)-num+1):
  46.             prelst.append(lst[i])
  47.             listSumEqual(prelst, lst[i+1:], equalsum, num-1)
  48.             prelst.pop()
  49.     # return reslst

  50. def filterlst(lst,sum):
  51.     for i in range(len(lst)):
  52.         if lst[i] > sum:
  53.             return lst[:i]

  54. if __name__ == "__main__":   
  55.     lst = list(range(1,100,1))   
  56.     equalsum = int(input("Please input Sum Number:"))
  57.     t1 = time.time()
  58.     lst = filterlst(lst,equalsum)
  59.     length = len(lst)
  60.     for num in range(1,length):
  61.         if sum(lst[:num]) > equalsum:
  62.             print("no match data")
  63.             break
  64.         else:
  65.             prelst = []
  66.             listSumEqual(prelst, lst, equalsum, num)  
  67.     t2 = time.time()
  68.     print("It cost %s second time!"%(t2-t1))
  69.    
复制代码


但这个比使用intertools.combinations 是要快100倍以上!
  1. from time import time
  2. from  itertools import combinations
  3. lst = list(range(1,100))
  4. num = int(input("Please input sum data:"))
  5. lstfilter = list(filter(lambda x:x<=num,lst))
  6. t1 = time()
  7. res = []
  8. for r in range(len(lstfilter)):
  9.     bn = combinations(lst, r)
  10.     for b in bn:
  11.         if sum(b)==30:
  12.             if b not in res:
  13.                 res.append(b)
  14. t2 = time()
  15. print("it cost %s time"%(t2-t1))
复制代码

TA的精华主题

TA的得分主题

发表于 2022-5-26 18:53 | 显示全部楼层
楼主,你的公式有没有优化版本啊?
如果将数据源更改到40行,刷新后pq直接崩溃。。。
谢了

TA的精华主题

TA的得分主题

发表于 2022-5-26 19:30 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
weiyt307 发表于 2021-12-20 16:50
表1的内容是什么?20089吗?但是好像又不对

即使表1是 20089
我按他的代码在pq里尝试运行,不过一直卡。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-21 18:51 , Processed in 0.033768 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表