108 lines
2.0 KiB
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;
|
|
}
|