using
System;
using
System.Collections.Generic;
using
System.Linq;
class
MainClass {
static
int
max(
int
a,
int
b) {
return
(a > b) ? a : b; }
static
int
knapSack(
int
W, List<
int
> wt,
List<
int
> val,
int
n)
{
Dictionary<
int
,
int
> umap =
new
Dictionary<
int
,
int
>();
HashSet<List<KeyValuePair<
int
,
int
>>> setSol
=
new
HashSet<List<KeyValuePair<
int
,
int
>>>();
for
(
int
i = 0; i < n; i++) {
umap.Add(wt[i], val[i]);
}
int
result =
int
.MinValue;
int
remaining_weight;
int
sum = 0;
do
{
sum = 0;
remaining_weight = W;
List<KeyValuePair<
int
,
int
>> possible
=
new
List<KeyValuePair<
int
,
int
>>();
for
(
int
i = 0; i < n; i++) {
if
(wt[i] <= remaining_weight) {
remaining_weight -= wt[i];
int
valAtWtI = umap[wt[i]];
sum += valAtWtI;
possible.Add(
new
KeyValuePair<
int
,
int
>(
wt[i], valAtWtI));
}
}
possible.Sort(
(x, y) => x.Key.CompareTo(y.Key));
if
(sum > result) {
result = sum;
}
if
(!setSol.Contains(possible)) {
foreach
(KeyValuePair<
int
,
int
> sol
in
possible) {
Console.Write(sol.Key +
": "
+ sol.Value
+
", "
);
}
Console.WriteLine();
setSol.Add(possible);
}
}
while
(nextPermutation(wt));
return
result;
}
static
bool
nextPermutation(List<
int
> arr)
{
int
i = arr.Count - 2;
while
(i >= 0 && arr[i] >= arr[i + 1]) {
i--;
}
if
(i < 0) {
return
false
;
}
int
j = arr.Count - 1;
while
(arr[j] <= arr[i]) {
j--;
}
int
temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
arr.Reverse(i + 1, arr.Count - i - 1);
return
true
;
}
public
static
void
Main(
string
[] args)
{
List<
int
> val =
new
List<
int
>{60, 100, 120};
List<
int
> wt =
new
List<
int
>{10, 20, 30};
int
W = 50;
int
n = val.Count;
int
maximum = knapSack(W, wt, val, n);
Console.WriteLine(
"Maximum Profit = "
+ maximum);
}
}