Solution: Below is the code using dynamic programming,
#define MAX(a,b) (a)>(b)?(a):(b) /* * Number of objects = 4 * Capacity ig Knapsack = 8 */ #define N 4 #define W 8 typedef struct { int32_t v; int32_t w; } Object; Object obj[N+1] = {{0, 0}, {15, 1}, {10, 5}, {9, 3}, {5, 4}}; int32_t V[N+1][W+1] = {0, }; int main() { int32_t n = 0; int32_t w = 0; int32_t value = 0; int32_t weight = 0; for(n=1; n<=N; n++) { for(w=0; w<=W; w++) { weight = obj[n].w; value = obj[n].v; /* * Cases: * - Last item is excluded from the final set: V[n-1][w] * - Last item is included in the final set: value + V[n-1][w-weight] * * Corner case: * - If weight > w, choose V[n-1][w] */ if(w >= weight) { V[n][w] = MAX( V[n-1][w], value + V[n-1][w-weight] ); } else { V[n][w] = V[n-1][w]; } } } printf("Ans = %d\n", V[N][W]); return 0; }
No comments:
Post a Comment