Так это же как раз то, что я пытаюсь избежать. Если я правильно понял о чём речь
Для чего собственно и нужен массив текущих местоположений гирь.
int taken = 0;
for (int i = 0; i < n; ++i) {
if (rand()*(n-i) < k-taken) {
++taken;
// Взять элемент i.
}
} Всё равно ж надо начинать с подсчёта общего веса и проверки, что оно вообще возможно, а также расчёта веса каждой кучки. А потом, используя ДП, набиваем один рюкзак, а по завершении второй.