3 回答

TA貢獻(xiàn)1773條經(jīng)驗(yàn) 獲得超3個贊
你重復(fù)了這sum = sum + i
條線。一次在循環(huán)的開始,然后在 else 條件下。我想你應(yīng)該刪除第一行并附加 sum + i。

TA貢獻(xiàn)1824條經(jīng)驗(yàn) 獲得超8個贊
也許我們可以討論這個作為討論的基礎(chǔ):
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)))
解釋 :
基本上,這個函數(shù)首先檢查 ifsum是否大于q. 僅當(dāng)是時,您才有兩個值,它們不是都小于或都大于 q。這是您的測試的先決條件,兩者中的一個與 的距離較小q。
現(xiàn)在,根據(jù)哪個更接近q,函數(shù)返回sum或sum - e。
現(xiàn)在我在這里使用動詞return而在代碼中使用yield:它不是一個常用的函數(shù),而是一個generator。關(guān)于這種類型函數(shù)的主要線索是,當(dāng)它們產(chǎn)生一個值時,你可以認(rèn)為在第一步中就像返回一個值,但有一個重要區(qū)別:函數(shù)本身不返回(即不結(jié)束),但是睡著了,等待它的下一次調(diào)用,保持它的完整狀態(tài),包括到現(xiàn)在計算的所有值,然后在yield之后繼續(xù)下一行,就好像之前什么都沒發(fā)生一樣 - 直到下一個yield關(guān)鍵字。
簡而言之:如果您想總結(jié)到任何事情但又不想在達(dá)到任何事情時停下來,IMO正是您所需要的...... :)

TA貢獻(xiàn)2012條經(jīng)驗(yàn) 獲得超12個贊
只是我對問題的看法,正如我在您的問題下方的評論中所述:
一種算法,它計算每個期間每個訂單所需的固定數(shù)量訂單數(shù)量,以便始終滿足需求。
另外,每個訂單的其余部分,在某個時期沒有被覆蓋,因此最終可以少一個訂單來覆蓋下一個時期的需求。
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
添加回答
舉報