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