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

我面临一个问题,我需要我的代码添加列表的元素,直到总和尽可能接近常数。达到常数后,我需要代码来存储总和以及索引总和(计算达到该总和所需的变量数)。我是 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

我没有收到错误消息,但该函数没有返回我所期望的。


慕田峪9158850
浏览 105回答 3
3回答

慕容3067478

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

有只小跳蛙

也许我们可以讨论这个作为讨论的基础:import numpy as npnp.random.seed(42)L = np.random.randint(0, 10, 10)q = 7print(L)def subs(L, q):&nbsp; &nbsp; sum = 0&nbsp; &nbsp; for i, e in enumerate(L):&nbsp; &nbsp; &nbsp; &nbsp; sum += e&nbsp; &nbsp; &nbsp; &nbsp; if sum > q:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if abs(sum - q) > abs(sum - e - q):&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = sum - e&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum = e&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n = i - 1&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else:&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = sum&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sum = 0&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n = i&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; yield n, r&nbsp; &nbsp; yield i, sumprint(list(subs(L, q)))解释 :基本上,这个函数首先检查 ifsum是否大于q. 仅当是时,您才有两个值,它们不是都小于或都大于 q。这是您的测试的先决条件,两者中的一个与 的距离较小q。现在,根据哪个更接近q,函数返回sum或sum - e。现在我在这里使用动词return而在代码中使用yield:它不是一个常用的函数,而是一个generator。关于这种类型函数的主要线索是,当它们产生一个值时,你可以认为在第一步中就像返回一个值,但有一个重要区别:函数本身不返回(即不结束),但是睡着了,等待它的下一次调用,保持它的完整状态,包括到现在计算的所有值,然后在yield之后继续下一行,就好像之前什么都没发生一样 - 直到下一个yield关键字。简而言之:如果您想总结到任何事情但又不想在达到任何事情时停下来,IMO正是您所需要的...... :)

繁花如伊

只是我对问题的看法,正如我在您的问题下方的评论中所述:一种算法,它计算每个期间每个订单所需的固定数量订单数量,以便始终满足需求。另外,每个订单的其余部分,在某个时期没有被覆盖,因此最终可以少一个订单来覆盖下一个时期的需求。def calcOrder(demand, Q):&nbsp; &nbsp; result = []&nbsp; &nbsp; rest = 0&nbsp; &nbsp; for i, e in enumerate(demand):&nbsp; &nbsp; &nbsp; &nbsp; current = e - rest&nbsp; &nbsp; &nbsp; &nbsp; order = np.ceil(current/Q)&nbsp; &nbsp; &nbsp; &nbsp; result.append(int(order))&nbsp; &nbsp; &nbsp; &nbsp; rest = order * Q - current&nbsp; &nbsp; return result例子:import numpy as npnp.random.seed(793)demand = np.random.randint(0, 51, 5)Q = 12demand# array([50, 20, 19, 48, 25])print(f'demand\tcurrent\torder\trest')rest = 0for i, e in enumerate(demand):&nbsp; &nbsp; current = e - rest&nbsp; &nbsp; order = int(np.ceil(current/Q))&nbsp; &nbsp; rest = order * Q - current&nbsp; &nbsp; print(f'{e}\t{current}\t{order}\t{rest}')# demand&nbsp; current order&nbsp; &nbsp;rest# 50&nbsp; &nbsp; &nbsp; 50&nbsp; &nbsp; &nbsp; 5&nbsp; &nbsp; &nbsp; &nbsp;10# 20&nbsp; &nbsp; &nbsp; 10&nbsp; &nbsp; &nbsp; 1&nbsp; &nbsp; &nbsp; &nbsp;2# 19&nbsp; &nbsp; &nbsp; 17&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp;7# 48&nbsp; &nbsp; &nbsp; 41&nbsp; &nbsp; &nbsp; 4&nbsp; &nbsp; &nbsp; &nbsp;7# 25&nbsp; &nbsp; &nbsp; 18&nbsp; &nbsp; &nbsp; 2&nbsp; &nbsp; &nbsp; &nbsp;6
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python