Advertisement
coffeebeforecode

DAA Lab DA 2 PP 2.1 Q3

Sep 19th, 2021
68
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.30 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int m(int a, int b){
  5.     if (a > b){
  6.         return a;
  7.     }
  8.     return b;
  9. }
  10.  
  11. void printKnapsack(int** f, int weights[], int values[], int n, int W){
  12.     int i;
  13.     int res = f[n][W];
  14.     int w = W;
  15.     for (i = n; (i > 0) && (res > 0) ; i--) {
  16.        
  17.         if (res == f[i-1][w])
  18.             continue;      
  19.         else {
  20.  
  21.             // This item is included.
  22.             printf("%d ", weights[i]);
  23.  
  24.             res = res - values[i];
  25.             w = w - weights[i];
  26.  
  27.         }
  28.     }
  29. }
  30.  
  31. int knapsack(int** f, int weights[], int values[], int n, int w, int i, int j){
  32.     int value = 0;
  33.     if (f[i][j] < 0){
  34.         if (j < weights[i]){
  35.             value = knapsack(f, weights, values, n, w, i-1, j);
  36.         }
  37.         else {
  38.             value = m(knapsack(f, weights, values, n, w, i-1, j), values[i]+knapsack(f, weights, values, n, w, i-1, j-weights[i]));
  39.         }
  40.         f[i][j] = value;
  41.     }
  42.     return f[i][j];
  43. }
  44.  
  45. void solve(){
  46.     // input
  47.     int w;
  48.     printf("\nEnter Knapsack capacity: ");
  49.     scanf("%d", &w);
  50.  
  51.     int n;
  52.     printf("\nEnter number of items: ");
  53.     scanf("%d", &n);
  54.  
  55.     int* weights = (int*)malloc(sizeof(int)* (n+1));
  56.     int* values = (int*)malloc(sizeof(int)* (n+1));
  57.  
  58.     int i, j;
  59.     printf("\nEnter Weights: ");
  60.     for(i = 1; i <= n; i++){
  61.         scanf("%d", &weights[i]);
  62.     }
  63.     printf("\nEnter Values: ");
  64.     for(i = 1; i <= n; i++){
  65.         scanf("%d", &values[i]);
  66.     }
  67.  
  68.     // creating dp table
  69.     int** f;
  70.     f = (int**)malloc(sizeof(int*)*(n+1));
  71.     for(i = 0; i < n+1; i++){
  72.         f[i] = (int*)malloc(sizeof(int)*(w+1));
  73.     }
  74.    
  75.     for(i = 0; i <= n; i++){
  76.         for(j = 0; j <= w; j++){
  77.             if (i == 0 || j == 0){
  78.                 f[i][j] = 0;
  79.             }
  80.             else{
  81.                 f[i][j] = -1;
  82.             }
  83.         }
  84.     }
  85.  
  86.     // filling the table
  87.     int maxVal = knapsack(f, weights, values, n, w, n, w);
  88.     printf("\nMaximum Value: %d\n", maxVal);
  89.     printKnapsack(f, weights, values, n, w);
  90.     /*
  91.     printf("\nTable:\n");
  92.     for(i = 0; i <= n; i++){
  93.         for(j = 0; j <= w; j++){
  94.             printf("%d ", f[i][j]);
  95.         }
  96.         printf("\n");
  97.     }
  98.     */
  99.  
  100. }
  101.  
  102. int main(){
  103.     solve();
  104.     return 0;
  105. }
  106.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement