吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1286|回复: 9
收起左侧

[求助] 用python算出来这个题

  [复制链接]
shangdu2005 发表于 2022-3-18 17:54
求解题,用python解答
mmexport1647595796287.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

lizy169 发表于 2022-3-19 09:49
能不能把重量范围对应的价格发出来?
kiyn 发表于 2022-3-26 09:31
正题中的种数应该是C4 0 +C4 1+C4 2+C4 3+C4 4=16种
(Cn m 为数学中的组合数公式表达式 这个表达式因为打字并不好表示 表示成这样子 此方法为隔板法)
具体看图片
微信图片_20220326093040.jpg
kiyn 发表于 2022-3-26 09:42
kiyn 发表于 2022-3-26 09:31
正题中的种数应该是C4 0 +C4 1+C4 2+C4 3+C4 4=16种
(Cn m 为数学中的组合数公式表达式 这个表达式因为打 ...

还不够严谨 会有重复的 比如三个隔板的时候 AA B BB 和 AA BB B 是重复的
打算用python先把所有组合出来再除重
fuwenyue 发表于 2022-4-2 15:24
[Python] 纯文本查看 复制代码
# -*- coding: utf-8 -*-
"""
Created on Sat Apr  2 04:32:16 2022

@author: fuwen
"""
import itertools

goods = '0AB' #0为空包

Num = 5
g = list(itertools.product(goods, repeat=Num))
g = [i for i in g if list(i).count('A')<3 if list(i).count('B')<4 ] #缩减计算
ng = [] #一个包裹的所有可能
for i in g:
    i = sorted(i)
    if i not in ng:
        ng.append(i)

gl = list(itertools.product(ng, repeat=Num))
gg = []
for k in gl:
    k= sorted(k)
    if str(k).count('A') ==2 and str(k).count('B') ==3:
        if k not in gg:
            gg.append(k)
result = []
for s in gg:
    s = sorted(s)
    if s not in result:
        result.append(s)

for p in  result:
    bags = ''
    for c in p:
        c = ''.join(c)
        c = c.replace('0', '')
        bags = bags+c+','
    print(bags.strip(','))


>>>
AABBB
A,ABBB
B,AABB
AA,BBB
AB,ABB
BB,AAB
A,A,BBB
A,B,ABB
A,AB,BB
B,B,AAB
B,AA,BB
B,AB,AB
A,A,B,BB
A,B,B,AB
B,B,B,AA
A,A,B,B,B

16看起来是对的……
unmask 发表于 2022-4-2 20:48
本帖最后由 unmask 于 2022-4-2 22:28 编辑

[Python] 纯文本查看 复制代码
goods = 'AABBB'
n = len(goods)


def sortStr(s):
    return ''.join(sorted(s))


def addGood(iter, g) -> list:
    rs = [sorted([*iter, g])]
    for i in iter:
        ss = [*iter]
        ss.remove(i)
        ss.append(sortStr(i+g))
        ss.sort()
        if ss not in rs:
            rs.append(ss)
    return rs


# 获取所有组合的可能列表
rlist = [[goods[0]]]
for i in range(1, n):
    ss = []
    for l in rlist:
        ss.extend(filter(lambda s: s not in ss, addGood(l, goods[i])))
    rlist = [*ss]
rlist.sort()
print(rlist)
whlee 发表于 2022-4-4 10:23
unmask 发表于 2022-4-2 20:48
[mw_shl_code=python,true]goods = 'AABBB'
n = len(goods)

很简单啊,你这计算量太小,直接单机遍历一下就出结果了。用python内置模块itertools就行了。太简单了,你按我这个思路百度一下就行。先用itertools把所有组合情况算出来,再用公式计算费用,最后按大小排序,搞定!
whlee 发表于 2022-4-4 10:26
很简单啊,你这计算量太小,直接单机遍历一下就出结果了。用python内置模块itertools就行了。太简单了,你按我这个思路百度一下就行。先用itertools把所有组合情况算出来,再用公式计算费用,最后按大小排序,搞定!
unmask 发表于 2022-4-4 10:37
whlee 发表于 2022-4-4 10:23
很简单啊,你这计算量太小,直接单机遍历一下就出结果了。用python内置模块itertools就行了。太简单了, ...

5楼的就是你说的itertools计算所有组合情况,你可以试试再多加几个商品,那组合是几何级数增长,效率非常低,你都会怀疑死机了。
whlee 发表于 2022-4-6 09:23
unmask 发表于 2022-4-4 10:37
5楼的就是你说的itertools计算所有组合情况,你可以试试再多加几个商品,那组合是几何级数增长,效率非常 ...

如果商品数量不断增加,确实计算复杂度会很高,那就需要算法知识了。从数据结构着手解决吧。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 13:46

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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