Рюкзак - Как определить, какие веса используются?

У меня есть код, который дает максимальное значение, которое я могу получить, заполнив рюкзак оптимальным набором гирь.

int arr[5] = {0, 0, 0, 0, 0};
int Weight[5] = {2, 5, 8, 7, 9};
int Value[5]  = {4, 5, 7, 9, 8};
const int n = 5;
const int maxCapacity = 20;

int maximum(int a, int b)
{
    return a > b ? a : b;
}

int knapsack(int capacity, int i)
{
    if (i > n-1) return 0;

    if (capacity < Weight[i])
    {
        return knapsack(capacity, i+1);
    }
    else
    {
        return maximum (knapsack(capacity, i+1),
                        knapsack(capacity - Weight[i], i+1) + Value[i]);
    }
}

int main (void)
{
    cout<<knapsack(maxCapacity,0)<<endl;
    return 0;
}

Мне нужно расширить это решение, распечатав все веса, чтобы найти оптимальное решение. Для этого я планирую использовать массив arr, инициализированный 0. Всякий раз, когда используется вес, я помечаю соответствующую позицию в arr 1, в противном случае она остается 0.

Первое, что пришло мне в голову, это изменить функцию max(), как показано ниже.

int maximum(int a, int b, int i)
{
    if (a > b)
    {
        if (arr[i] == 1) arr[i] = 0;
        return a;
    }
    else
    {
        if (arr[i] == 0) arr[i] = 1;
        return b;
    }
}

Но даже это решение не работает для некоторых комбинаций весов и значений. Любые предложения о том, как двигаться дальше?


person bibbsey    schedule 27.09.2012    source источник
comment
Вы можете опубликовать пример комбинации, которая не работает, обычно это очень показательно.   -  person Bartek Banachewicz    schedule 27.09.2012
comment
PS: вам следует рассмотреть возможность замены этих массивов на std::array<T>, если вы используете С++ 11, что намного удобнее.   -  person akappa    schedule 27.09.2012
comment
@BartekBanachewicz: Пример массива уже жестко запрограммирован в коде. В этом случае будут использоваться веса - 2, 7, 9, а окончательное значение arr[5] равно {1, 1, 0, 1, 1}, где должно было быть {1, 0, 0, 1, 1}.   -  person bibbsey    schedule 27.09.2012
comment
Если вы собираетесь определить const int n = 5, вы также можете использовать его для определения размера массива.   -  person Aesthete    schedule 27.09.2012
comment
@Эстет: я знаю. Фактический код не такой. Массивы не жестко закодированы в реальном коде. Я упростил это, чтобы опубликовать здесь.   -  person bibbsey    schedule 27.09.2012


Ответы (1)


Проблема в том, что вы не знаете, какая из двух опций выбрана этой командой.

return maximum (knapsack(capacity, i+1),
                knapsack(capacity - Weight[i], i+1) + Value[i]);

Я думаю, вы можете использовать две переменные для хранения значений, и если выбран вес (значение этой переменной больше), вы можете добавить его в массив. Надеюсь, это решит вашу проблему.

person Access Denied    schedule 29.10.2012