题意:
输入三个正整数N,M,S(N<=100,M<N,S<=2^30)分别代表数的结点个数,非叶子结点个数和需要查询的值,接下来输入N个正整数(<1000)代表每个结点的权重,接下来输入M行,每行包括一个两位数字组成的数代表非叶子结点的编号以及数字x表示它的孩子结点个数,接着输入x个数字表示孩子结点的编号。以非递增序输出从根到叶子结点的路径权重,它们的和等于S。
代码:
#define HAVE_STRUCT_TIMESPEC
#include<bits/stdc++.h>
using namespace std;
int w[107];
vector<int>v[107];
int s;
int now;
vector<int>path;
int flag;
int vis[107];
vector<int>ans[107];
int cnt;
int dfs(int x){
path.push_back(w[x]);
now+=w[x];
if(now==s){
if(!vis[x])
ans[++cnt]=path;
path.pop_back();
now-=w[x];
return 0;
}
else if(now>s){
path.pop_back();
now-=w[x];
return 0;
}
else
for(auto it:v[x])
dfs(it);
path.pop_back();
now-=w[x];
return 0;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n,m;
cin>>n>>m>>s;
for(int i=0;i<n;++i)
cin>>w[i];
for(int i=1;i<=m;++i){
string fa;
cin>>fa;
int f=(fa[0]-'0')*10+fa[1]-'0';
vis[f]=1;
int x;
cin>>x;
string son;
for(int j=1;j<=x;++j){
cin>>son;
int s=(son[0]-'0')*10+son[1]-'0';
v[f].push_back(s);
}
}
dfs(0);
sort(ans+1,ans+1+cnt);
for(int i=cnt;i;--i){
if(i<cnt)
cout<<"\n";
cout<<ans[i][0];
for(int j=1;j<ans[i].size();++j)
cout<<" "<<ans[i][j];
}
return 0;
}