85 lines
2.0 KiB
C
85 lines
2.0 KiB
C
/* ************************************************************************** */
|
|
/* */
|
|
/* ::: :::::::: */
|
|
/* powerset.c :+: :+: :+: */
|
|
/* +:+ +:+ +:+ */
|
|
/* By: ruiferna <ruiferna@student.42porto.com> +#+ +:+ +#+ */
|
|
/* +#+#+#+#+#+ +#+ */
|
|
/* Created: 2025/09/22 00:00:00 by ruiferna #+# #+# */
|
|
/* Updated: 2025/09/22 17:12:50 by ruiferna ### ########.fr */
|
|
/* */
|
|
/* ************************************************************************** */
|
|
|
|
#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);
|
|
} |