Несоответствие в рекурсивном и мемоизированном решении о рюкзакеJAVA

Программисты JAVA общаются здесь
Ответить
Гость
 Несоответствие в рекурсивном и мемоизированном решении о рюкзаке

Сообщение Гость »


I'm currently working on a knapsack problem and have implemented both a recursive solution without memoization and a memoized version. Surprisingly, the recursive solution is giving me the correct answer, but when I try to memoize the solution, I'm getting an incorrect result.

Recursion Code which gives correct output .

class Solution { //Function to return max value that can be put in knapsack of capacity W. static int knapSack(int W, int wt[], int val[], int n) { // your code here int[][] dp = new int[n + 1][W + 1]; for(int[] arr : dp) { Arrays.fill(arr, -1); } return recursion(0, 0, W, wt, val, dp); } private static int recursion(int ind, int curVal, int curWeight, int[] weights, int[] values, int[][] dp) { // Base cases if (curWeight < 0) { return (int) (-1e9); } if (ind == weights.length) { return curVal; } if (curWeight == 0) { return curVal; } // Calculate the maximum value considering two options: including the current item or not int pick = recursion(ind + 1, curVal + values[ind], curWeight - weights[ind], weights, values, dp); int nonPick = recursion(ind + 1, curVal, curWeight, weights, values, dp); return Math.max(pick, nonPick); } } The Memorization Code:
private static int memoization(int ind, int curVal, int curWeight, int[] weights, int[] values, int[][] dp) { // Base cases if (curWeight < 0) { return (int) (-1e9); } if (ind == weights.length) { return curVal; } if (curWeight == 0) { return dp[ind][curWeight] = curVal; } // If the result is already calculated, return it if (dp[ind][curWeight] != -1) { return dp[ind][curWeight]; } // Calculate the maximum value considering two options: including the current item or not int pick = memoization(ind + 1, curVal + values[ind], curWeight - weights[ind], weights, values, dp); int nonPick = memoization(ind + 1, curVal, curWeight, weights, values, dp); // Store the result in the memoization table dp[ind][curWeight] = Math.max(pick, nonPick); return dp[ind][curWeight]; }

Источник: https://stackoverflow.com/questions/781 ... k-solution
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»