这题题目有点长就不那啥了,是个不错的题。
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
struct Node
{
int weight;
vector<int> childs;
} Nodes[110];
int N, M, S;
bool cmp(int a, int b){
return Nodes[a].weight > Nodes[b].weight;
}
void dfs(int root, vector<int> &ans, int sum){
sum += Nodes[root].weight;
if(sum > S)
return;
ans.push_back(Nodes[root].weight);
if(sum == S){
//这里一定要判断下当前节点是不是叶子节点
if(Nodes[root].childs.size() == 0){
for(int i = 0; i < ans.size(); i++)
if(i == ans.size() - 1)
printf("%d\n", ans[i]);
else
printf("%d ", ans[i]);
}
}
else{
for(int i = 0; i < Nodes[root].childs.size(); i++)
dfs(Nodes[root].childs[i], ans, sum);
}
ans.pop_back();
}
int main(){
scanf("%d%d%d", &N, &M, &S);
for(int i = 0; i < N; i++)
scanf("%d", &Nodes[i].weight);
while(M--){
int parent, cntchild, child;
scanf("%d%d", &parent, &cntchild);
while(cntchild--){
scanf("%d", &child);
Nodes[parent].childs.push_back(child);
}
sort(Nodes[parent].childs.begin(), Nodes[parent].childs.end(), cmp);
}
vector<int> ans;
int sum = 0;
dfs(0, ans, sum);
return 0;
}