方法:深度遍历,记录路径的点权值及点权之和。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int N,M,S,weight[105]={0};
vector<int> child[105];
bool cmp(int a,int b){
return weight[a]>weight[b];
}
vector<int> wpath;
void DFS(int root,int sum){
if(sum>S) return;
if(sum+weight[root]==S&&child[root].size()==0){
int len=wpath.size();
for(int i=0;i<len;i++)
printf("%d ",wpath[i]);
printf("%d\n",weight[root]);
}
sum+=weight[root];
wpath.push_back(weight[root]);
int numc=child[root].size();
for(int i=0;i<numc;i++){
DFS(child[root][i],sum);
}
wpath.pop_back();
}
int main(){
scanf("%d%d%d",&N,&M,&S);
for(int i=0;i<N;i++)
scanf("%d",&weight[i]);
for(int i=0;i<M;i++){
int root,numc,c;
scanf("%d%d",&root,&numc);
for(int j=0;j<numc;j++){
scanf("%d",&c);
child[root].push_back(c);
}
sort(child[root].begin(),child[root].end(),cmp);
}
DFS(0,0);
return 0;
}