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