牛客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;
}
posted @ 2022-09-04 11:58  Vijurria  阅读(33)  评论(0编辑  收藏  举报