2017-11-02 3 views
3

数字のリストの可能な限りすべてを取るプログラムを書いています。可能な合計は、合計を2つのグループに分割します。グループは、別の番号の上と下の2つのグループに分割されます。これは、これまでの私のコードです:予想通りwhileループの最初の半分が実行さ可能な合計が1回以上返されない関数

import itertools 
a = 0 
tableheight = [1000, 2000] 
cointhick = [50, 100, 200, 400] 
while a < len(tableheight): 
    result = [seq for i in range(len(cointhick), 0, -1) for seq in itertools.combinations(cointhick, i) if sum(seq) <= tableheight[a]] 
    great = [] 
    b = 0 
    while b < len(result): 
     great.append(sum(result[b])) 
     b += 1 
    print(result) 
    print(great) 
    print(max(great)) 
    resulta = [seq for i in range(len(cointhick), 0, -1) for seq in itertools.combinations(cointhick, i) if sum(seq) >= tableheight[a]] 
    mcadam = [] 
    c = 0 
    while c < len(resulta): 
     mcadam.append(sum(resulta[c])) 
     c += 1 
    print(resulta) 
    print(mcadam) 
    print(min(mcadam)) 
    a += 1 

私はプログラム(具体的には部分印刷resultaとマクアダムを通して)を進める際には、しかし、私は述べ、エラーが発生しますresultaのグループが空であること。以下のコードは、 'tableheight'というグループの最初の番号(1000に相当)を使用して実行されることに注意してください。プログラムが実行されたときに表示されるものは次のとおりです(それぞれの出力の横にコメントします)。

[(50, 100, 200, 400), (50, 100, 200), (50, 100, 400), (50, 200, 400), (100, 200, 400), (50, 100), (50, 200), (50, 400), (100, 200), (100, 400), (200, 400), (50,), (100,), (200,), (400,)] # All possible sums using numbers in group 'cointhick' that when added will be less than 1000 # 
[750, 350, 550, 650, 700, 150, 250, 450, 300, 500, 600, 50, 100, 200, 400] # Results of sums used in each tuple in above list # 
750 # The maximum sum found in the above list # 
[] # The list of sums that when added will be greater than 1000 
[] # The result of the sums found in the above list 
Traceback (most recent call last): 
    File "C:\Users\Owner\Desktop\Renamable Programs\thing.py", line 23, in <module> 
    print(min(mcadam)) 
ValueError: min() arg is an empty sequence 
>>> 

数値が1000より大きい場合、何かがうまくいかない場合があります。これについてのヘルプは、巨大なものです。ありがとうございます!

+2

合計は1000を超えません。したがって、 '[]]のように' resulta'には何も格納されません。 'min([])はできません。 – herbaman

+0

@herbamanは2分で私を打ち負かしました...--)あなたのしきい値より上に合計がない場合、あなたは何を期待していますか?空のコレクションに対して 'max'や' min'を行うことはできません。各要素に1000を追加すると、上半分にこの問題が発生します。つまり、しきい値以下の合計*が存在しないことに注意してください。 – Prune

+0

@herbaman数値をいくつか取得できる方法はありますか合計を作るときに繰り返しますか? 400 + 400 + 200 + 400など? – QFlat

答えて

1

コメントの中で言われたように、合計が1000を超える組み合わせは見つかりません。これは、itertools.combinationsが繰り返し可能な要素を2回も使用していないためです。

この問題を回避するには、反復可能な要素の複数の使用を許可するバージョンを使用する必要があります。itertools.combinations_with_replacement
https://docs.python.org/3/library/itertools.html#itertools.combinations_with_replacement

関連する問題