2
2
3
3
int max (int a , int b ) { return (a > b ) ? a : b ; }
4
4
5
- // Returns the maximum value that
6
- // can be put in a knapsack of capacity W
7
- int knapSack (int W , int wt [], int val [], int n )
5
+ int knapSack (int W , int wt [], int pt [], int n , int solutionVector [n ])
8
6
{
9
7
int i , w ;
10
8
int K [n + 1 ][W + 1 ];
@@ -15,28 +13,48 @@ int knapSack(int W, int wt[], int val[], int n)
15
13
if (i == 0 || w == 0 )
16
14
K [i ][w ] = 0 ;
17
15
else if (wt [i - 1 ] <= w )
18
- K [i ][w ] = max (val [i - 1 ]
19
- + K [i - 1 ][w - wt [i - 1 ]],
16
+ K [i ][w ] = max (pt [i - 1 ] + K [i - 1 ][w - wt [i - 1 ]],
20
17
K [i - 1 ][w ]);
21
18
else
22
19
K [i ][w ] = K [i - 1 ][w ];
23
20
}
24
21
}
25
22
23
+ // To get the solution vector
24
+ int count = 0 , flag , base = K [n ][W ];
25
+
26
+ for (i = n ;i > 0 ;i -- ){
27
+ int j = i - 1 ;
28
+ base = base - count ;
29
+ flag = 0 ;
30
+ // Checks if the weight is unique for the given value of i
31
+ for (w = 0 ; w <=W ; w ++ ){
32
+ if (K [j ][w ] == base ){
33
+ solutionVector [i - 1 ] = 0 ;
34
+ count = 0 ;
35
+ flag = 1 ;
36
+ break ;
37
+ }
38
+ }
39
+ if (flag == 1 ) // Not unique (determined from above)
40
+ continue ;
41
+ else {
42
+ solutionVector [i - 1 ] = 1 ;
43
+ count = pt [i - 1 ];
44
+ }
45
+ }
46
+
26
47
return K [n ][W ];
27
48
}
28
49
29
50
// Driver Code
30
51
int main ()
31
52
{
32
- /*int profit[] = { 60, 100, 120 };
33
- int weight[] = { 10, 20, 30 };
34
- int W = 50;*/
35
53
int i , n ;
36
54
printf ("Enter number of items: " );
37
55
scanf ("%d" , & n );
38
56
39
- int profit [n ], weight [n ], W ;
57
+ int profit [n ], weight [n ], W , solutionVector [ n ] ;
40
58
printf ("Enter the profits and weights:\n" );
41
59
for (i = 0 ;i < n ;i ++ ){
42
60
printf ("Item %d\n" , i + 1 );
@@ -47,9 +65,18 @@ int main()
47
65
printf ("\n" );
48
66
}
49
67
50
- printf ("Enter the capacity of the Knapsack: " );
68
+ printf ("Profits and their weights:\n\n" );
69
+ for (i = 0 ;i < n ;i ++ ){
70
+ printf ("p[%d] = %d\tw[%d] = %d\n" , i , profit [i ], i , weight [i ]);
71
+ }
72
+
73
+ printf ("\nEnter the capacity of the Knapsack: " );
51
74
scanf ("%d" , & W );
52
75
53
- printf ("Profit: %d" , knapSack (W , weight , profit , n ));
76
+ int max_profit = knapSack (W , weight , profit , n , solutionVector );
77
+ printf ("Solution Vector: " );
78
+ for (i = 0 ; i < n ; i ++ ) printf ("%d " , solutionVector [i ]);
79
+
80
+ printf ("\nMaximum Profit: %d\n" , max_profit );
54
81
return 0 ;
55
82
}
0 commit comments