Dp
It looks like a statistical scheme: the DP[I][K] represents the number of scenarios in which the sum of values is k, taking into account the first line.
Transfer is very simple:\[dp[i][k]=\sum \limits_{j=1}^m dp[i-1][k-j]\]
Code
#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<cmath>#define max(a,b) a>b?a:b#define maxn 102using namespace std;int n,fcnt,fina;int num[maxn],bkt[maxn][maxn],dp[maxn][maxn*maxn],mx[maxn];int main(){ cin>>n>>fcnt; for (int i=1,a,b;i<=n;++i) { scanf("%d",&a); for (int j=1;j<=a;++j) { scanf("%d",&b); bkt[i][b]++; mx[i]=max(mx[i],b); } fina+=mx[i]; } for (int i=1;i<=mx[1];++i) {dp[1][i]=bkt[1][i];} for (int i=2;i<=n;++i) { for (int j=1;j<=fina;++j) for (int k=1;k<=mx[i];++k) if (j-k>0&&bkt[i][k]) dp[i][j]+=dp[i-1][j-k]*bkt[i][k]; } int cnt=0; for (int i=1;i<=fina;++i) for (int j=1;j<=dp[n][i];++j) { cnt++; if (cnt>fcnt) return 0; printf("%d ",i); } return 0;}
The building blocks of Y