int main(void) { int i, result; int *data; scanf("%d", &n); data = (int *)malloc(sizeof(int)*n); half = 0; for (i=0; i<n; i++) { scanf("%d", (data+i)); half += *(data+i); } if (half%2 != 0) { printf("impossible\n"); free(data); return 0; } // sort merge_sort(data); half /= 2; cnt = 0; // find (backtracking) findAvailable(data, 0, 0); if (cnt == 0) printf("impossible\n"); else printf("%d\n", cnt); free(data); return 0; }
void findAvailable(int *data, int sum, int idx) { int i; for (i=idx; i<n; i++) { if (sum+data[i] > half) break; else if (sum+data[i] == half) cnt++; else findAvailable(data, sum+data[i], i+1); } }
char *stringMemory::allocate(size_t size) { assert(m_head); if (size == 0) return allocate(1); const size_t totalSize = getSize(size); region *available = findAvailable(totalSize); if (available) { available->setFree(false); return (char *)(available + 1); } else { // Merge free blocks until they're all merged while (mergeFree()) ; // Now try and find a free block available = findAvailable(totalSize); // Got a free block if (available) { available->setFree(false); return (char *)(available + 1); } } abort(); }