dfs搜索,通过>M这个条件进行剪枝, 先对每类物品的数组进行排序,如果在某个节点已经大于M的时候,以下的分支的个数都可以用乘法得出。

#include<iostream>
#include<algorithm>
using namespace std;

int k,M;

int arr[7][110];
int len[7];
long long temsum;
long long dfs(int round){
    long long ans=0;
    if(round>=k){
        if(temsum>M){
            return 1;
        }else{
            return 0;
        }
    }else{
        ans+=dfs(round+1);//empty
        for(int j=0;j<len[round];++j){
            if(temsum+arr[round][j]>M){
                long long now=len[round]-j;
                for(int t=round+1;t<k;++t){
                    now*=len[t]+1;//including empty
                }
                ans+=now;
                break;
            }else{
                temsum+=arr[round][j];
                ans+=dfs(round+1);
                temsum-=arr[round][j];
            }
        }
        return ans;
    }
}

int main(){
    while(cin>>k>>M){
        temsum=0;
        for(int i=0;i<k;++i){
            cin>>len[i];
            for(int j=0;j<len[i];++j){
                cin>>arr[i][j];
            }
            sort(arr[i],arr[i]+len[i]);
        }
        cout<<dfs(0)<<endl;
    }
}