50 lines
1.0 KiB
C
50 lines
1.0 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#define MAX_N 100
|
|
|
|
int T;
|
|
int n;
|
|
int w[MAX_N];
|
|
int x[MAX_N];
|
|
int solution_count = 0;
|
|
|
|
void dfs(int t, int sum, int k) {
|
|
if (sum == T) {
|
|
solution_count++;
|
|
if (solution_count > 50)
|
|
return;
|
|
int *re = malloc(sizeof(int) * k);
|
|
int j = 0;
|
|
for (int i = 0; i < k; i++) {
|
|
if (x[i]) {
|
|
re[j++] = w[i];
|
|
}
|
|
}
|
|
for (int i = 0; i < j; i++) {
|
|
printf("%d ", re[i]);
|
|
}
|
|
printf("\n");
|
|
} else if (sum < T && k < n) {
|
|
// 剪枝
|
|
if (sum + w[k] <= T) {
|
|
x[k] = 1;
|
|
dfs(t + 1, sum + w[k], k + 1);
|
|
}
|
|
x[k] = 0;
|
|
dfs(t + 1, sum, k + 1);
|
|
}
|
|
}
|
|
|
|
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]);
|
|
}
|
|
dfs(0, 0, 0);
|
|
printf("Total Solution Count: %d\n", solution_count);
|
|
return 0;
|
|
}
|