What is 0/1 Knapsack problem ?The knapsack or rucksack problem is a problem in combinatorial optimization. Here there are a set of items(n) which has a profit value(v) and weight(w).
There is a bag which has a maximum capacity(W). Now the problem is to fill the bag with the following restrictions : 1. You can either choose an item completely or reject it. (0 or 1) 2. The total weight of bag must not exceed its maximum capacity W. i.e. (Sum of w[i]) <= W 3. The total value or profit of items chosen must be maximum. i.e. Sum of p[i] is maximumwhere 0 < i <=n.
How to solve 0/1 Knapsack problem in Java ?Step1: Structure: Characterize the structure of an optimal solution. – Decompose the problem into smaller problems, and find a relation between the structure of the optimal solution of the original problem and the solutions of the smaller problems.
Step2: Principle of Optimality: Recursively define the value of an optimal solution. – Express the solution of the original problem in terms of optimal solutions for smaller problems.Step 3: Bottom-up computation: Compute the value of an optimal solution in a bottom-up fashion by using a table structure.
Step 4: Construction of optimal solution: Construct an optimal solution from computed information.
import
java.util.Scanner;
public
class
Knapsack {
private
int
n,W;
//number of items and maximum capacity
private
int
w[],v[];
//weights and values of items
private
int
V[][];
//table to store results of sub-problems
/**
* Takes necessary inputs and initializes for solving
*/
private
void
initialize(){
Scanner sc =
new
Scanner(System.in);
System.out.print(
"Enter number of items : "
);
n = sc.nextInt();
//number of items
System.out.print(
"Enter W of knapsack : "
);
W = sc.nextInt();
//capacity of knapsack
w =
new
int
[n];
v =
new
int
[n];
System.out.println(
"Enter ws and vs of items : "
);
for
(
int
i =
0
; i < n; i++){
w[i] = sc.nextInt();
//weight of item
v[i] = sc.nextInt();
//profit of item
}
V =
new
int
[n+
1
][W+
1
];
//initializing the table to hold results
for
(
int
i =
0
; i <= W; i++) V[
0
][i] =
0
;
}
/**
* Computes the result
*/
public
void
knapsack(){
//table for backtracking to get the items chosen
int
x[][] =
new
int
[n+
1
][W+
1
];
//filling tables
for
(
int
i =
1
; i <= n; i++)
for
(
int
j =
0
; j <= W; j++)
if
((w[i-
1
] <= j) && (v[i-
1
]+V[i-
1
][j-w[i-
1
]] > V[i-
1
][j])){
V[i][j] = v[i-
1
] + V[i-
1
][j-w[i-
1
]];
x[i][j] =
1
;
}
else
{
V[i][j] = V[i-
1
][j];
x[i][j] =
0
;
}
//backtracking
System.out.printf(
"Items Chosen\n%5s%7s%7s\n"
,
"Item"
,
"Weight"
,
"Profit"
);
int
K = W;
for
(
int
i = n; i >=
1
; i--)
if
(x[i][K] ==
1
){
System.out.printf(
"%5d%7d%7d\n"
,i,w[i-
1
],v[i-
1
]);
K -= w[i-
1
];
}
System.out.println(
"Maximum profit : "
+V[n][W]);
}
public
static
void
main(String[] args) {
Knapsack obj =
new
Knapsack();
obj.initialize();
obj.knapsack();
}
}
The Top Casino In Pennsylvania, Ranked | DRMCD
ReplyDeleteFind out about our top 용인 출장안마 casino in Pennsylvania, which is right up 김해 출장마사지 there with everything you need to know. Rating: 5 · 고양 출장마사지 1 vote · $100.00 · 순천 출장샵 In stock 안산 출장샵