Проблема Knapsack01, написанные на C#


Это код, написанный в приличном стиле? Ценю обратную связь : )

private static int Max(int a, int b)
{
    return a > b ? a : b;
} 

/// <summary>
/// Returns the solution to Knapsack01 problem. Uses bottom up dynamic programming.
/// </summary>
private static int Knapsack01(int capacity, int[] values, int[] weights)
{
    int[,] table = new int[values.Length + 1, capacity + 1];


    for (int row = 0; row <= values.Length; row++)
    {
        for (int column = 0; column <= capacity; column++)
        {
            if (row == 0 || column == 0)
            {
                // base case
                table[row, column] = 0;
            }

            else if (weights[row -1] <= column)
            {
                // item fits 
                int valueAbove = table[row - 1, column];
                int spareCapacity = column - weights[row - 1];
                int currentValue = values[row - 1] + table[row - 1, spareCapacity];
                table[row, column] = Max(valueAbove, currentValue);
            }

            else
            {
                // item doesn't fit so copy value from above cell
                table[row, column] = table[row - 1, column];
            }
        }
    }

    return table[values.Length, capacity];
}


Комментарии
2 ответа

Это не очень хорошо документированы. - Ты можешь определить, что такое "задача о ранце", глядя на некоторые комментарии и некоторые имена переменных, но если бы я был разработчиком, я бы, наверное, добавить комментарий, заблокировать, чтобы описать, как это работает в случае, если кто-то еще наткнулся на этот код впоследствии и необходима для понимания его быстро.

Я не совсем уверен, почему они не просто использовать математику.Макс вместо того, чтобы создавать свои собственные функции (может быть, они перенесли его из какой-то другой язык, что не было этой функции пригодится?).

Помимо тех вещей, если он работает и возвращает точные результаты, то я не вижу огромной проблемы с ним.

1
ответ дан 6 февраля 2018 в 06:02 Источник Поделиться

Я мог бы переопределить Max() Как

private static T Max<T>(T a, T b) where T : IComparable<T>
{
return a?.CompareTo(b) > 0 ? a : b;
}

чтобы иметь возможность повторного использования для любого типа, который реализует IComparable<T> интерфейс (int реализует IComparable<int>так он до сих пор работает, как ожидалось). Это будет немного медленнее, но она быстро даст тебе максимум из всего чего угодно, intС doubleС stringы...

1
ответ дан 6 февраля 2018 в 05:02 Источник Поделиться