牛客dfs专题 NC13594 选择困难症(dfs+剪枝)
链接:https://ac.nowcoder.com/acm/problem/13594
来源:牛客网
题目描述
有k类物品,每类物品的个数为Ai,每个物品有一个喜欢值Vj,代表小L对这件物品的喜欢程度。
小L想知道,有多少种方案,使得选出来的总喜欢值>M
需要注意,每类物品,至多选择1件,可以不选。
输入描述:
多组输入
每组输出一行,表示方案数
示例1
输入
2 5
3 1 3 4
2 2 3
2 1
2 2 2
2 2 2
输出
3
8
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=200200,M=2002;
LL n,m;
LL ans=0;
vector<LL> v[N];
void dfs(LL idx,LL sum)
{
if(sum>m)//剪枝
{
LL res=1;
for(LL i=idx;i<=n;i++)
res*=(v[i].size()+1);
ans+=res;
return ;
}
if(idx==n+1)
{
return ;
}
for(LL i=0;i<v[idx].size();i++)
dfs(idx+1,sum+v[idx][i]);
dfs(idx+1,sum);
}
int main()
{
cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
while(cin>>n>>m)
{
for(LL i=0;i<=100;i++)
v[i].clear();
ans=0;
for(LL i=1;i<=n;i++)
{
LL k;
cin>>k;
while(k--)
{
LL x;
cin>>x;
v[i].push_back(x);
}
}
dfs(1,0);//从第一个物品开始,现在已经积攒的数量是0
cout<<ans<<endl;
}
return 0;
}