我只想到了朴素方法,膜拜楼下大佬的剪枝思路,蛮快的。

if(res>m){
        ll re=1;
        for(int j = i;j<k;j++){
            re*=(asize[j]+1);//注意加上没有拿该物品的情况
        }
        ans+=re;
        return;
    }
#include<cstring>
const int N = 1e9 + 7;
using namespace std;
typedef long long ll;
ll m,k,ans = 0;
ll a[110][110],asize[10];
void dfs(int i,ll res){
    if(res>m){
        ll re=1;
        for(int j = i;j<k;j++){
            re*=(asize[j]+1);//注意加上没有拿该物品的情况
        }
        ans+=re;
        return;
    }
    if(i ==k) return;
    for(int j =0;j<=asize[i];j++){
        dfs(i+1,res+a[i][j]);
    }
}
int main(){
    while(cin >> k >> m){
        ans =0;
        memset(a,0,sizeof(a));
        for(int i =0;i<k;i++){
            cin >>asize[i];
            for(int j =1;j<=asize[i];j++){
                cin >> a[i][j];
            }
        }
        dfs(0,0);
        cout<< ans<<endl;
    }
    return 0;
}