コメンターが指摘したように、これは NP 困難な問題です。ただし、データがそれほど悪くない場合は、次のようにするとうまくいくはずです。
picks[] := K numbers chosen at random from the population
While sum(picks) is not in the allowable range
if sum(picks) < MinRange
select an element p from picks at random
let subpop := elements in population which are larger than p
replace p with a random element from subpop
if sum(picks) > MaxRange
select an element p from picks at random
let subpop := elements in population which are smaller than p
replace p with a random element from subpop
これは非常に簡単にコーディングできます。制約を満たす比較的ランダムな選択が返されます。実際に問題の難しいインスタンスがない限り、それほど長くはかからないはずです。その場合、見つけるのは非常に困難になります。任意のアルゴリズムを使用したソリューション。
アルゴリズムを高速化したい場合は、要素を毎回p
最小/最大の要素として選択できます。picks
これにより、アルゴリズムが高速化されますが、ピックの「ランダム」な選択が少なくなります。