EX_03/powerset/powerset.c
2025-09-22 17:16:23 +01:00

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);
}