比较裸的分组背包
不过有个更优复杂度的思路(用可持久化可并堆做)可以看看
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<ctime>
#include<cstring>
using namespace std;
int n, K, s;
int m[105][105];
int F[105][10005];
int main() {
scanf("%d%d", &n, &K);
for (int i = 1; i <= n; ++i) {
scanf("%d", &m[i][0]);
int t(0);
for (int j = 1; j <= m[i][0]; ++j) {
scanf("%d", &m[i][j]);
t = max(t, m[i][j]);
}
s += t;
}
F[0][0] = 1;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m[i][0]; ++j) {
for (int k = s; k >= m[i][j]; --k) {
F[i][k] += F[i-1][k-m[i][j]];
}
}
}
int cnt = 0;
for (int i = 0; i <= s; ++i) {
for (int j = 1; j <= F[n][i]; ++j) {
printf("%d ", i);
if (++cnt == K) return 0;
}
}
return 0;
}