我想找到一種有效的算法將整數值分成最大值,最小值範圍內的某個值。應該有儘可能少的價值。將值分成最大值,最小值範圍
例如: 最大= 7,MIN = 3 然後
8 = 4 + 4
9 = 4 + 5
16 = 5 + 5 + 6 (not 4 + 4 + 4 + 4)
EDIT
爲了使它更清楚,讓舉一個例子。假設你有一堆蘋果,你想把它們裝進籃子裏。每個籃子可容納3到7個蘋果,並且您希望籃子的數量儘可能小。
**我提到價值應該平分,但這並不重要。我更關心籃子的數量。
我想找到一種有效的算法將整數值分成最大值,最小值範圍內的某個值。應該有儘可能少的價值。將值分成最大值,最小值範圍
例如: 最大= 7,MIN = 3 然後
8 = 4 + 4
9 = 4 + 5
16 = 5 + 5 + 6 (not 4 + 4 + 4 + 4)
EDIT
爲了使它更清楚,讓舉一個例子。假設你有一堆蘋果,你想把它們裝進籃子裏。每個籃子可容納3到7個蘋果,並且您希望籃子的數量儘可能小。
**我提到價值應該平分,但這並不重要。我更關心籃子的數量。
這讓我感到很有趣,所以我有機會剽竊出一個快速解決方案。我認爲這可能是一個有趣的起點,它會給你一個有效的解決方案,儘可能少的數字,或儘可能相似的數字,所有這些都在由min_bound和max_bound定義的範圍的範圍內 數= INT(輸入( 「編號」)) min_bound = 3 max_bound = 7
def improve(solution):
solution = list(reversed(solution))
for i, num in enumerate(solution):
if i >= 2:
average = sum(solution[:i])/i
if average.is_integer():
for x in range(i):
solution[x] = int(average)
break
return solution
def find_numbers(number, division, common_number):
extra_number = number - common_number * division
numbers_in_solution = [common_number] * division
if extra_number < min_bound and \
extra_number + common_number <= max_bound:
numbers_in_solution[-1] += extra_number
elif extra_number < min_bound or extra_number > max_bound:
return None
else:
numbers_in_solution.append(extra_number)
solution = improve(numbers_in_solution)
return solution
def tst(number):
try:
solution = None
for division in range(number//max_bound, number//min_bound + 1): # Reverse the order of this for numbers as close in value to each other as possible.
if round (number/division) in range(min_bound, max_bound + 1):
solution = find_numbers(number, division, round(number/division))
elif (number // division) in range(min_bound, max_bound + 1): # Rarely required but catches edge cases
solution = find_numbers(number, division, number // division)
if solution:
print(sum(solution), solution)
break
except ZeroDivisionError:
print("Solution is 1, your input is less than the max_bound")
tst(number)
for x in range(1,100):
tst(x)
此代碼只是爲了演示一個想法,我敢肯定,它可以進行調整以提高性能。
通過簡短的解決方案,您可能可以遍歷列表來查看是否存在使數字更接近的平均值。例如,如果你的解決方案是[5,5,5,2],它將首先看5和2,他們的平均值是3.5,所以它會跳過它。然後看看5,5,2,它們的平均值是4,所以它可以將解決方案更新爲[5,4,4,4]。 –
如果輸入是20,那麼結果是[5,5,5,5]。它應該是[7,7,6] – TomNg
不再是了!我已經更新過了。它需要在地板分區之前檢查四捨五入的分割。我在平均概念中加入了,所以它會嘗試像[5,5,5,2]這樣的答案,並將它們轉化爲[5,4,4,4] –
你如何定義「均勻劃分」?是什麼讓「16 = 5 + 5 + 6」比「16 = 4 + 4 + 4 + 4」更好? –
對不起,我沒有說清楚,我已經更新了這個問題,謝謝 – TomNg
好的,下一個問題:究竟是什麼讓「16 = 5 + 5 + 6」比「16 = 6 + 6 + 4」好? –