#include #include #include typedef struct { int idx; int sum; int inc; } htnode; typedef struct { int size; htnode *table; } hashtable; #define EMPTY (htnode){-1,-1,-1} int *geninput ( int N ) { int *A, i; A = (int *)malloc(N * sizeof(int)); for (i=0; i T) return -1; if (i >= N) return sum; val0 = exhs(A,N,T,sum,i+1); val1 = (sum+A[i]<=T) ? exhs(A,N,T,sum+A[i],i+1) : -1; return (val0 >= val1) ? val0 : val1; } int h ( int i, int sum, int s ) { return (100003 * i + 103 * sum) % s; } hashtable htinit ( int s ) { hashtable H; int i; H.size = s; H.table = (htnode *)malloc(s * sizeof(htnode)); for (i=0; i T) return -1; if (i >= N) return sum; if (htsearch(H,i,sum)) val0 = -1; else { htinsert(H,i,sum,0); val0 = hashs(A,N,T,sum,i+1,H); } if ((sum+A[i]>T) || (htsearch(H,i,sum+A[i]))) val1 = -1; else { htinsert(H,i,sum+A[i],1); val1 = hashs(A,N,T,sum+A[i],i+1,H); } return (val0 >= val1) ? val0 : val1; } void findsol ( int *A, int N, int P, hashtable H ) { int *include, i, k, firstprn; include = (int *)malloc(N * sizeof(int)); for (i=0; i=0; --i) { if (htsearch(H,i,P)) break; } while (P>0) { k = htsearch(H,i,P) - 1; if (H.table[k].inc) { include[i] = 1; P -= A[i]; } --i; } firstprn = 1; printf(" Solution: "); for (i=0; i 1) N = atoi(argv[1]); else scanf("%d", &N); printf(" N = %d\n", N); A = geninput(N); S = 0; for (i=0; i