In This post we are Solve 0 or 1 Knapsack problem using Dynamic Programming method.
10] Solve 0/1 Knapsack problem using Dynamic Programming method.
PROGRAM :-
import java.util.Scanner;
public class Knapsackdp {
public void solve(int[] wt, int[] val, int W, int N)
{
int i, j;
int[][] sol = new int[N + 1][W + 1];
for (i = 0; i <= N; i++)
{
for (j = 0; j <= W; j++)
{
if (i == 0 || j == 0)
sol[i][j] = 0;
else if (wt[i] > j)
sol[i][j] = sol[i - 1][j];
else
sol[i][j] = Math.max((sol[i - 1][j]), (sol[i - 1][j - wt[i]] + val[i]));
}
}
System.out.println("The optimal solution is : " + sol[N][W]);
int[] selected = new int[N + 1];
for (i = 0; i < N + 1; i++)
selected[i] = 0;
i = N;
j = W;
while (i > 0 && j > 0)
{
if (sol[i][j] != sol[i - 1][j])
{
selected[i] = 1;
j = j - wt[i];
}
i--;
}
System.out.println("\nItems selected : ");
for (i = 1; i < N + 1; i++)
if (selected[i] == 1)
System.out.print(i + " ");
System.out.println();
}
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
Knapsackdp ks = new Knapsackdp();
System.out.println("Enter number of elements ");
int n = scan.nextInt();
int[] wt = new int[n + 1];
int[] val = new int[n + 1];
System.out.println("\nEnter weight for " + n + "elements");
for (int i = 1; i <= n; i++)
wt[i] = scan.nextInt();
System.out.println("\nEnter value for " + n + "elements");
for (int i = 1; i <= n; i++)
val[i] = scan.nextInt();
System.out.println("\nEnter knapsack weight ");
int W = scan.nextInt();
ks.solve(wt, val, W, n);
}
}
