data-structure-experiments/1/solution3.c

108 lines
2.0 KiB
C

#include <stdio.h>
#include <stdlib.h>
#define MAX_N 100
int T;
int n;
int w[MAX_N];
int index_arr[MAX_N];
int solution_count = 0;
void printSubset(int *subset, int size) {
solution_count++;
for (int i = 0; i < size; i++) {
printf("%d", subset[i]);
if (i != size - 1) {
printf(" ");
}
}
printf("\n");
}
void findSubsets(int *arr, int n, int T, int *subset, int size, int index) {
if (T == 0) {
printSubset(subset, size);
return;
}
if (index == n) {
return;
}
if (arr[index] > T) {
return;
}
subset[size] = arr[index];
findSubsets(arr, n, T - arr[index], subset, size + 1, index + 1);
while (index < n - 1 && arr[index] == arr[index + 1]) {
index++;
}
findSubsets(arr, n, T, subset, size, index + 1);
}
void d(int *arr, int n, int T) {
int *subset = (int *)malloc(n * sizeof(int));
int size = 0;
findSubsets(arr, n, T, subset, size, 0);
free(subset);
}
void swap(int *arr, int i, int j) {
int tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
tmp = index_arr[i];
index_arr[i] = index_arr[j];
index_arr[j] = tmp;
}
void sort(int *arr, int n) {
int i = 0, j = n - 1;
int pivot = arr[0];
int pivot_index = 0;
while (i < j) {
while (i < j && arr[j] >= pivot) {
j--;
}
if (i < j) {
swap(arr, i, j);
i++;
}
while (i < j && arr[i] <= pivot) {
i++;
}
if (i < j) {
swap(arr, i, j);
j--;
}
}
}
int main() {
freopen("data.in", "r", stdin);
// freopen("data.out", "w", stdout);
scanf("%d", &T);
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%d", &w[i]);
index_arr[i] = i;
}
sort(w, n);
for (int i = 0; i < n; i++) {
printf("%d ", w[i]);
}
printf("\n");
d(w, n, T);
// printf("Total Solution Count: %d\n", solution_count);
printf("%d", solution_count);
return 0;
}