2016-04-10 71 views
-2

我想找到一種有效的算法將整數值分成最大值,最小值範圍內的某個值。應該有儘可能少的價值。將值分成最大值,最小值範圍

例如: 最大= 7,MIN = 3 然後

8 = 4 + 4 
9 = 4 + 5 
16 = 5 + 5 + 6 (not 4 + 4 + 4 + 4) 

EDIT

爲了使它更清楚,讓舉一個例子。假設你有一堆蘋果,你想把它們裝進籃子裏。每個籃子可容納3到7個蘋果,並且您希望籃子的數量儘可能小。

**我提到價值應該平分,但這並不重要。我更關心籃子的數量。

+0

你如何定義「均勻劃分」?是什麼讓「16 = 5 + 5 + 6」比「16 = 4 + 4 + 4 + 4」更好? –

+0

對不起,我沒有說清楚,我已經更新了這個問題,謝謝 – TomNg

+0

好的,下一個問題:究竟是什麼讓「16 = 5 + 5 + 6」比「16 = 6 + 6 + 4」好? –

回答

1

這讓我感到很有趣,所以我有機會剽竊出一個快速解決方案。我認爲這可能是一個有趣的起點,它會給你一個有效的解決方案,儘可能少的數字,或儘可能相似的數字,所有這些都在由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) 

此代碼只是爲了演示一個想法,我敢肯定,它可以進行調整以提高性能。

+0

通過簡短的解決方案,您可能可以遍歷列表來查看是否存在使數字更接近的平均值。例如,如果你的解決方案是[5,5,5,2],它將首先看5和2,他們的平均值是3.5,所以它會跳過它。然後看看5,5,2,它們的平均值是4,所以它可以將解決方案更新爲[5,4,4,4]。 –

+0

如果輸入是20,那麼結果是[5,5,5,5]。它應該是[7,7,6] – TomNg

+0

不再是了!我已經更新過了。它需要在地板分區之前檢查四捨五入的分割。我在平均概念中加入了,所以它會嘗試像[5,5,5,2]這樣的答案,並將它們轉化爲[5,4,4,4] –

相關問題