#include #include #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++; if (solution_count > 50) return; 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; }