我想自己最好再看看这道题的dfs函数,多模拟几次(一般这种记路径的题目push和pop总是成对出现的)
#include <stdio.h>
#include <algorithm>
#include <vector>
using namespace std;
const int maxv=110;
vector<int> tree[maxv];
vector<int> outcome[maxv];
int w[maxv]={0};
int n,m,s;
vector<int> path;
bool cmp(int a,int b){
return w[a]>w[b];
}
void dfs(int p){
if(tree[p].size()==0){
path.push_back(p);
int sum=0;
for(int i=0;i<path.size();i++){
sum=sum+w[path[i]];
}
if(s==sum){
for(int i=0;i<path.size();i++){
printf("%d",w[path[i]]);
if(i!=path.size()-1){
printf(" ");
}else{
printf("\n");
}
}
}
path.pop_back();
return;
}
path.push_back(p);
for(int i=0;i<tree[p].size();i++){
dfs(tree[p][i]);
}
path.pop_back();
}
int main(){
scanf("%d %d %d",&n,&m,&s);
for(int i=0;i<n;i++){
scanf("%d",&w[i]);
}
for(int i=0;i<m;i++){
int id,number;
scanf("%d %d",&id,&number);
for(int j=0;j<number;j++){
int temp;
scanf("%d",&temp);
tree[id].push_back(temp);
}
sort(tree[id].begin(),tree[id].end(),cmp);
}
dfs(0);
return 0;
}