Beispiel #1
0
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;
}
Beispiel #2
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);
    }
}
Beispiel #3
0
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();
}