Рубрики

Java-программа 0-1 Рюкзак Проблема

Рекурсивное решение

/ * Наивная рекурсивная реализация задачи о ранце 0-1 * /

class Knapsack {

  

    // Вспомогательная функция, которая возвращает максимум два целых числа

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

  

    // Возвращает максимальное значение, которое может

    // положить в рюкзак вместимостью W

    static int knapSack(int W, int wt[], int val[], int n)

    {

        // Базовый вариант

        if (n == 0 || W == 0)

            return 0;

  

        // Если вес n-го элемента больше

        // чем рюкзак вместимостью Вт, то

        // этот элемент не может быть включен в оптимальное решение

        if (wt[n - 1] > W)

            return knapSack(W, wt, val, n - 1);

  

        // Возвращаем максимум двух случаев:

        // (1) n-й элемент включен

        // (2) не включены

        else

            return max(val[n - 1] + knapSack(W - wt[n - 1], wt, val, n - 1),

                       knapSack(W, wt, val, n - 1));

    }

  

    // Программа драйвера для проверки вышеуказанной функции

    public static void main(String args[])

    {

        int val[] = new int[] { 60, 100, 120 };

        int wt[] = new int[] { 10, 20, 30 };

        int W = 50;

        int n = val.length;

        System.out.println(knapSack(W, wt, val, n));

    }

}
/ * Этот код предоставлен Раджатом Мишрой * /

Выход:

220

Решение для динамического программирования

// Решение на основе динамического программирования для задачи о ранце 0-1

class Knapsack {

  

    // Вспомогательная функция, которая возвращает максимум два целых числа

    static int max(int a, int b) 

{ return (a > b) ? a : b; }

  

    // Возвращает максимальное значение, которое можно положить в рюкзак

    // мощности Вт

    static int knapSack(int W, int wt[], int val[], int n)

    {

        int i, w;

        int K[][] = new int[n + 1][W + 1];

  

        // Построить таблицу K [] [] снизу вверх

        for (i = 0; i<= n; i++) {

            for (w = 0; w<= W; w++) {

                if (i == 0 || w == 0)

                    K[i][w] = 0;

                else if (wt[i - 1]<= w)

                    K[i][w] = max(val[i - 1] + K[i - 1][w - wt[i - 1]], K[i - 1][w]);

                else

                    K[i][w] = K[i - 1][w];

            }

        }

  

        return K[n][W];

    }

  

    // Программа драйвера для проверки вышеуказанной функции

    public static void main(String args[])

    {

        int val[] = new int[] { 60, 100, 120 };

        int wt[] = new int[] { 10, 20, 30 };

        int W = 50;

        int n = val.length;

        System.out.println(knapSack(W, wt, val, n));

    }

}
/ * Этот код предоставлен Раджатом Мишрой * /

Выход:

220

Пожалуйста, обратитесь к полной статье о динамическом программировании | Установите 10 (0-1 Рюкзак Задача) для более подробной информации!

Рекомендуемые посты:

Java-программа 0-1 Рюкзак Проблема

0.00 (0%) 0 votes