为了账号安全,请及时绑定邮箱和手机立即绑定

列表元素的总和,直到限制

列表元素的总和,直到限制

慕田峪9158850 2022-06-02 10:33:49
我面临一个问题,我需要我的代码添加列表的元素,直到总和尽可能接近常数。达到常数后,我需要代码来存储总和以及索引总和(计算达到该总和所需的变量数)。我是 Python 的初学者,这个问题很难解决。我尝试了一个while循环和一个for循环。那时,我有点卡住了,不确定我的方法是否准确。这是逻辑的一个具体例子。假设第 1 期的需求为 10,第 2 期的需求为 23,Q 为 12。(这里的 Q 代表最优数量)。我想弄清楚的是我们是否应该在第 1 期下订单,其中包括第 1+2 期的需求,或者是否最好在第 1 期下订单,在第 2 期下订单。Q 是决定它的因素,如果期间 1 的需求更接近 Q 或期间 1+2 的累积需求更接近 Q。在本例中,|10-12| < |(10+23)-12|,因此我们要记录一个周期 1 的订单,另一个记录周期 2 的订单。def feeoq(q, demand):    sum = 0    prod = []    for i in demand:        sum = sum + i        if abs(sum - q) < abs(sum + i - q):            return prod.append(sum)        else:            sum = sum + i我没有收到错误消息,但该函数没有返回我所期望的。
查看完整描述

3 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

你重复了这sum = sum + i条线。一次在循环的开始,然后在 else 条件下。我想你应该删除第一行并附加 sum + i。



查看完整回答
反对 回复 2022-06-02
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

也许我们可以讨论这个作为讨论的基础:


import numpy as np


np.random.seed(42)


L = np.random.randint(0, 10, 10)

q = 7


print(L)


def subs(L, q):

    sum = 0

    for i, e in enumerate(L):

        sum += e

        if sum > q:

            if abs(sum - q) > abs(sum - e - q):

                r = sum - e

                sum = e

                n = i - 1

            else:

                r = sum

                sum = 0

                n = i

            yield n, r

    yield i, sum


print(list(subs(L, q)))

解释 :


基本上,这个函数首先检查 ifsum是否大于q. 仅当是时,您才有两个值,它们不是都小于或都大于 q。这是您的测试的先决条件,两者中的一个与 的距离较小q。

现在,根据哪个更接近q,函数返回sum或sum - e。


现在我在这里使用动词return而在代码中使用yield:它不是一个常用的函数,而是一个generator。关于这种类型函数的主要线索是,当它们产生一个值时,你可以认为在第一步中就像返回一个值,但有一个重要区别:函数本身不返回(即不结束),但是睡着了,等待它的下一次调用,保持它的完整状态,包括到现在计算的所有值,然后在yield之后继续下一行,就好像之前什么都没发生一样 - 直到下一个yield关键字。


简而言之:如果您想总结到任何事情但又不想在达到任何事情时停下来,IMO正是您所需要的...... :)


查看完整回答
反对 回复 2022-06-02
?
繁花如伊

TA贡献2012条经验 获得超12个赞

只是我对问题的看法,正如我在您的问题下方的评论中所述:


一种算法,它计算每个期间每个订单所需的固定数量订单数量,以便始终满足需求。

另外,每个订单的其余部分,在某个时期没有被覆盖,因此最终可以少一个订单来覆盖下一个时期的需求。


def calcOrder(demand, Q):

    result = []

    rest = 0

    for i, e in enumerate(demand):

        current = e - rest

        order = np.ceil(current/Q)

        result.append(int(order))

        rest = order * Q - current

    return result

例子:


import numpy as np

np.random.seed(793)


demand = np.random.randint(0, 51, 5)

Q = 12


demand

# array([50, 20, 19, 48, 25])


print(f'demand\tcurrent\torder\trest')

rest = 0

for i, e in enumerate(demand):

    current = e - rest

    order = int(np.ceil(current/Q))

    rest = order * Q - current

    print(f'{e}\t{current}\t{order}\t{rest}')


# demand  current order   rest

# 50      50      5       10

# 20      10      1       2

# 19      17      2       7

# 48      41      4       7

# 25      18      2       6


查看完整回答
反对 回复 2022-06-02
  • 3 回答
  • 0 关注
  • 104 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信