亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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

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

米脂 2022-06-02 11:11:59
我面臨一個問題,我需要我的代碼添加列表的元素,直到總和盡可能接近常數。達到常數后,我需要代碼來存儲總和以及索引總和(計算達到該總和所需的變量數)。我是 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 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

你重復了這sum = sum + i條線。一次在循環的開始,然后在 else 條件下。我想你應該刪除第一行并附加 sum + i。



查看完整回答
反對 回復 2022-06-02
?
慕俠2389804

TA貢獻1719條經驗 獲得超6個贊

只是我對問題的看法,正如我在您的問題下方的評論中所述:


一種算法,它計算每個期間每個訂單所需的固定數量訂單數量,以便始終滿足需求。

另外,每個訂單的其余部分,在某個時期沒有被覆蓋,因此最終可以少一個訂單來覆蓋下一個時期的需求。


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
?
慕雪6442864

TA貢獻1812條經驗 獲得超5個贊

也許我們可以討論這個作為討論的基礎:


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
  • 3 回答
  • 0 關注
  • 129 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號