我只想到了朴素方法,膜拜楼下大佬的剪枝思路,蛮快的。
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;
}