题解 | 选择困难症
选择困难症
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;
}