题解 | 选择困难症

选择困难症

https://ac.nowcoder.com/acm/problem/13594

感觉这题dp不错,尤其是对于剪枝得思考 应该挺常用,先说说我对于dfs得感受:对于每一层得所有可能都要考虑,然后进入下一层即可,对于此题每一层得所有可能即是 当前step选哪一个/不选,对于具体细节请看注释

using namespace std;
typedef long long ll;
vector<ll>v[10];
ll m,k,l,x,ans;
void dfs(int step,ll res){
    if(res>m){
        ll sum = 1;
        for(int i=step;i<=k;i++){//这是个剪枝
            sum*=(v[i].size()+1);
        }
        ans+=sum;
        return ;
    }
    if(step==k+1)return ; //此处不能放在前面,这是常见错误,当第k个选完后进入step+1,还没有统计step==k得所选结果就被return了
    for(int i=0;i<v[step].size();i++){//这个完全是选则某个得情况
        dfs(step+1,res+v[step][i]);
    }
    dfs(step+1,res);//不选情况
}
int main()
{
    while(cin>>k>>m){
        ans=0;
        for(int i=0;i<10;i++)v[i].clear();
        for(int i=1;i<=k;i++){
            cin>>l;
            for(int j=0;j<l;j++){
                cin>>x;
                v[i].push_back(x);
            }
        }
        dfs(1,0);
        cout<<ans<<endl;
    }
    return 0;
}

全部评论

相关推荐

嵌入式求职之路:可以看我经验😂,https://www.nowcoder.com/share/jump/73221730841876945
点赞 评论 收藏
分享
FieldMatching:看成了猪头顾问,不好意思
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务