简单的深度优先搜索
#include<stdio.h>
#include<vector>
#include<algorithm>
#include<map>
using namespace std;
map<int, vector<int>> m; // 保存每个节点的子节点
long long weight[100]; // 保存每个节点的权重
vector<vector<long long>> ans; // 保存结果序列
void DFS(long long sum, int node, vector<long long> trace, long long thres)
{
sum += weight[node];
trace.push_back(weight[node]);
if (sum > thres)
{
return;
}
if (m.count(node) == 0 && sum == thres)
{
ans.push_back(trace);
return;
}
for (int i = 0; i < m[node].size(); i++)
{
DFS(sum, m[node][i], trace, thres);
}
}
bool cmp(vector<long long> a, vector<long long> b)
{
int size = (a.size() > b.size()) ? b.size() : a.size();
for (int i = 0; i < size; i++)
{
if (a[i] > b[i])
{
return true;
}
else if (a[i] < b[i])
{
return false;
}
}
return false;
}
int main()
{
int N, M;
long long S;
scanf("%d%d%lld", &N, &M, &S);
for (int i = 0; i < N; i++)
{
scanf("%lld", &weight[i]);
}
for (int i = 0; i < M; i++)
{
int parent, size;
scanf("%d%d", &parent, &size);
for (int j = 0; j < size; j++)
{
long long tmp;
scanf("%lld", &tmp);
m[parent].push_back(tmp);
}
}
vector<long long> trace;
DFS(0, 0, trace, S);
sort(ans.begin(), ans.end(), cmp);
for (int i = 0; i < ans.size(); i++)
{
for (int j = 0; j < ans[i].size(); j++)
{
if (j == ans[i].size() - 1)
{
printf("%d\n", ans[i][j]);
break;
}
printf("%d ", ans[i][j]);
}
}
return 0;
}