重みの合計が指定された重み W と正確に等しいセット内の重み付き要素のすべての可能な組み合わせを見つけたいと思います
{ 'A', 'B', 'C', 'D', 'E' }
セットwhereweights = {'A':2, 'B':1, 'C':3, 'D':2, 'E':1}
およびから k 個の要素を選択したいとしますW = 4
。
次に、これは次のようになります。
('A','B','E')
('A','D')
('B','C')
('B','D','E')
('C','E')
強引な方法は、指定されたセットのすべての順列を ( を使用してitertools.permutations
) 見つけ、最初の k 個の要素を W の重み付き合計でスプライスすることだと認識しています。しかし、私はセットごとに少なくとも 20 個の要素を扱っています。高い。
ナップザックのバリアントを使用すると、重みのみ (値ではなく) が考慮され、重みの合計がW (劣っていない)に等しくなければならない場合に役立つと思います。
これをPythonで実装したいのですが、cs理論のヒントがあれば役立ちます。エレガンスにボーナスポイント!