あなたの目標は最大50個のタプルを正確に見つけることです。ソリューションは現在のアプローチよりも少し複雑になります。 これらの数字を考えてみましょう:
x 20
y 25
z 10
m 15
n 8
p 22
あなたのアルゴリズムでは、最初のx = 20、Y = 25を追加し、このタプルを完了しまうマッチング5を見つけることなく、リストの残りの部分を歩くでしょう。正しい解決策は "x、n、p"と "y、z、m"です。
作業アルゴリズムは、合計が50未満になるエントリのチェーンを収集し、1つのチェーンが50に達したときにリストを通じて1つの反復を停止します。チェーン要素がリストから削除され、見つけることができます。
Pythonコード約束通り:(これは私の最初のpythonプログラム:-)で、スタイルをご容赦)
class ListElement:
def __init__(self, name, value):
self.name = name
self.value = value
def __repr__(self):
return self.name + "=" + self.value.__str__()
class ChainElement:
def __init__(self, prev, listElement):
self.prev = prev
self.listElement = listElement
if prev:
self.value = listElement.value + prev.value
else:
self.value = listElement.value
def __repr__(self):
if self.prev:
return self.prev.__repr__() + "," + self.listElement.__repr__()
else:
return self.listElement.__repr__()
def removeAllFrom(self, list):
list.remove(self.listElement)
if self.prev:
self.prev.removeAllFrom(list)
list = []
list.append(ListElement("x", 20))
list.append(ListElement("y", 25))
list.append(ListElement("z", 10))
list.append(ListElement("m", 15))
list.append(ListElement("n", 8))
list.append(ListElement("p", 22))
def find_chain():
chains = [ChainElement(None, list[0])]
for le in list[1:]:
new_chains = []
for ce in chains:
new_chain = ChainElement(ce, le)
if new_chain.value == 50:
return new_chain
elif new_chain.value < 50:
new_chains.append(new_chain)
chains.extend(new_chains);
return None
while list:
tuple = find_chain()
if tuple:
print "Found:", tuple
tuple.removeAllFrom(list)
else:
print
print "Residue:", list
break
このプログラムは1が存在するにもかかわらず、完全なソリューションを見つけることができませんそのための値の組み合わせがあります。これを理解して修正することは、読者の練習として残されています...
これまでに開発したコードを表示すると、少なくとも完全な動作例として役立ちます。 – Conor