0/1 knapsack problem (dynamic programming)
This is the top down approach to solve the above mentioned problem using Memoization technique to avoid re computation of overlapping sub problems.
#include<stdio.h> #define MAXN 20 #define MAXW 100 int look[MAXN][MAXW]; int max(int a, int b) { return (a > b)? a : b; } int knapSack(int W, int wt[], int val[], int n){ if(look[n][W]!=-1)return look[n][W]; if (n == -1 || W == 0) return 0; if (wt[n] > W){ look[n-1][W]=knapSack(W, wt, val, n-1); look[n][W]=look[n-1][W]; } else look[n][W]=max( val[n] + knapSack(W-wt[n], wt, val, n-1),knapSack(W, wt, val, n-1)); return look[n][W]; } int main() { int val[] = {7,4,5,1}; int wt[] = {5,4,3,1}; int i,j,W = 7; int n = sizeof(val)/sizeof(val[0]); for(i=0;i<n;i++) for(j=0;j<=W;j++)look[i][j]=-1; printf("%d", knapSack(W, wt, val, n-1)); return 0; }Output: 9
No comments:
Post a Comment