73 lines
1.2 KiB
C
73 lines
1.2 KiB
C
#include "powerset.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 *set, int set_size, int target, int *subset,
|
|
int subset_size, int index)
|
|
{
|
|
int current_sum;
|
|
int i;
|
|
|
|
if (index == set_size)
|
|
{
|
|
current_sum = 0;
|
|
i = 0;
|
|
while (i < subset_size)
|
|
{
|
|
current_sum += subset[i];
|
|
i++;
|
|
}
|
|
if (current_sum == target)
|
|
print_subset(subset, subset_size);
|
|
return ;
|
|
}
|
|
find_subsets(set, set_size, target, subset, subset_size, index + 1);
|
|
subset[subset_size] = set[index];
|
|
find_subsets(set, set_size, target, subset, subset_size + 1, index + 1);
|
|
}
|
|
|
|
int main(int argc, char **argv)
|
|
{
|
|
int *set;
|
|
int *subset;
|
|
int target;
|
|
int set_size;
|
|
int i;
|
|
|
|
if (argc < 2)
|
|
return (1);
|
|
target = atoi(argv[1]);
|
|
set_size = argc - 2;
|
|
set = malloc(sizeof(int) * set_size);
|
|
if (!set)
|
|
return (1);
|
|
subset = malloc(sizeof(int) * set_size);
|
|
if (!subset)
|
|
{
|
|
free(set);
|
|
return (1);
|
|
}
|
|
i = 0;
|
|
while (i < set_size)
|
|
{
|
|
set[i] = atoi(argv[i + 2]);
|
|
i++;
|
|
}
|
|
find_subsets(set, set_size, target, subset, 0, 0);
|
|
free(set);
|
|
free(subset);
|
|
return (0);
|
|
} |