Вы должны добавить другое измерение к вашему массиву для индекса предмета, аналогично динамическому программному решению для обычной задачи о ранце (вы можете вычислить его без этого,но, по крайней мере, это будет сложнее).
Я оставлю детали для вас, но это даст вам что-то вроде этого:
dp[i, ks1, ks2] = max(
dp[i-1, ks1, ks2],
dp[i-1, ks1 - loads[i], ks2] + prices[i],
dp[i-1, ks1, ks2 - loads[i]] + prices[i]
);
Теперь вам нужноначните с конца и несколько раз выясните, какое из приведенных выше значений было максимальным, и продолжите с этим значением.
Это можно сделать, просто проверив, равна ли левая часть любому из значений нас правой стороны.
int ks1 = car1_load, ks2 = car2_load;
for (i = N; i > 0; i--)
{
if (ks1 >= loads[i] && dp[i, ks1, ks2] == dp[i-1, ks1 - loads[i], ks2] + prices[i])
{
// Add i to car 1
ks1 -= loads[i];
}
else if (ks2 >= loads[i] && dp[i, ks1, ks2] == dp[i-1, ks1, ks2 - loads[i]] + prices[i])
{
// Add i to car 2
ks2 -= loads[i];
}
// if it's equal to dp[i-1, ks1, ks2], we don't need to do anything
}
Код может немного отличаться от этого, в зависимости от того, как вы фактически изменили свой код, добавив индекс элемента в качестве измерения массива.