88 lines
2.8 KiB
Java
88 lines
2.8 KiB
Java
/*
|
|
This is a Java Program to Implement Knapsack Algorithm. This algorithm is used to solve knapsack problem : Given a set of items, each with a mass and a value, determine the number of each item to include in a collection so that the total weight is less than or equal to a given limit and the total value is as large as possible.
|
|
*/
|
|
|
|
/**
|
|
** Java Program to Implement Knapsack Algorithm
|
|
**/
|
|
|
|
import java.util.Scanner;
|
|
|
|
/** Class Knapsack **/
|
|
public class Knapsack
|
|
{
|
|
public void solve(int[] wt, int[] val, int W, int N)
|
|
{
|
|
int NEGATIVE_INFINITY = Integer.MIN_VALUE;
|
|
int[][] m = new int[N + 1][W + 1];
|
|
int[][] sol = new int[N + 1][W + 1];
|
|
for (int i = 1; i <= N; i++)
|
|
{
|
|
for (int j = 0; j <= W; j++)
|
|
{
|
|
int m1 = m[i - 1][j];
|
|
int m2 = NEGATIVE_INFINITY;
|
|
if (j >= wt[i])
|
|
m2 = m[i - 1][j - wt[i]] + val[i];
|
|
/** select max of m1, m2 **/
|
|
m[i][j] = Math.max(m1, m2);
|
|
sol[i][j] = m2 > m1 ? 1 : 0;
|
|
}
|
|
}
|
|
/** make list of what all items to finally select **/
|
|
int[] selected = new int[N + 1];
|
|
for (int n = N, w = W; n > 0; n--)
|
|
{
|
|
if (sol[n][w] != 0)
|
|
{
|
|
selected[n] = 1;
|
|
w = w - wt[n];
|
|
}
|
|
else
|
|
selected[n] = 0;
|
|
}
|
|
/** Print finally selected items **/
|
|
System.out.println("\nItems selected : ");
|
|
for (int i = 1; i < N + 1; i++)
|
|
if (selected[i] == 1)
|
|
System.out.print(i +" ");
|
|
System.out.println();
|
|
}
|
|
/** Main function **/
|
|
public static void main (String[] args)
|
|
{
|
|
Scanner scan = new Scanner(System.in);
|
|
System.out.println("Knapsack Algorithm Test\n");
|
|
/** Make an object of Knapsack class **/
|
|
Knapsack ks = new Knapsack();
|
|
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);
|
|
}
|
|
}
|
|
|
|
/*
|
|
Enter number of elements
|
|
5
|
|
|
|
Enter weight for 5 elements
|
|
50 10 20 40 30
|
|
|
|
Enter value for 5 elements
|
|
300 60 90 100 240
|
|
|
|
Enter knapsack weight
|
|
60
|
|
|
|
Items selected :
|
|
2 3 5 |