68 lines
1.1 KiB
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);
|
|
} |