EX_03/level-2/powerset/powerset_clean.c

68 lines
1.1 KiB
C

#include <stdio.h>
#include <stdlib.h>
void print_subset(int *subset, int size)
{
int i;
i = 0;
while (i < size)
{
printf("%d", subset[i]);
if (i < size - 1)
printf(" ");
i++;
}
printf("\n");
}
void find_subsets(int target, int *set, int set_size, int index, int *current_path, int path_len)
{
if (target == 0)
return (print_subset(current_path, path_len));
if (index >= set_size)
return;
current_path[path_len] = set[index];
find_subsets(target - set[index], set, set_size, index + 1, current_path, path_len + 1);
find_subsets(target, set, set_size, index + 1, current_path, path_len);
}
int main(int argc, char **argv)
{
int target;
int *numbers;
int *path;
int size;
int i;
if (argc < 2)
return (0);
target = atoi(argv[1]);
size = argc - 2;
numbers = (int *)malloc(sizeof(int) * size);
if (!numbers)
return (1);
path = (int *)malloc(sizeof(int) * size);
if (!path)
{
free(numbers);
return (1);
}
i = 0;
while (i < size)
{
numbers[i] = atoi(argv[i + 2]);
i++;
}
find_subsets(target, numbers, size, 0, path, 0);
free(numbers);
free(path);
return (0);
}