// Based on "Algorithms in C, Third Edition", and // "Algorithms in Java, Third Edition", Robert Sedgewick // 0/1 (divisible) knapsack by dynamic programming // where there is an unlimited number of each item type. // CSE 2320 Notes 7 and Sedgewick 5.3 #include #include int unknown=(-1); typedef struct { int val,size; } item; int N,m; item *items; int *maxKnown; item *itemKnown; // From Sedgewick int knap(int M,int level) { int i, space, max, maxi = 0, t; for (i=0;i= 0) if ((t = knap(space,level+1) + items[i].val) > max) { max = t; maxi = i; } maxKnown[M] = max; itemKnown[M] = items[maxi]; for (i=0;i0) printf("%3d %3d %3d %3d\n",i,maxKnown[i],itemKnown[i].size, itemKnown[i].val); printf("Solution has value %d:\n",maxKnown[m]); printf(" i size val\n"); printf("-------------\n"); count=0; leftoverVal=maxKnown[m]; leftoverSize=m; while (leftoverVal>0) { count++; printf("%3d %3d %3d\n", count,itemKnown[leftoverSize].size,itemKnown[leftoverSize].val); leftoverVal-=itemKnown[leftoverSize].val; leftoverSize-=itemKnown[leftoverSize].size; } printf("Unused capacity %d\n",leftoverSize); free(items); free(maxKnown); free(itemKnown); }