直接DFS回溯就好,到叶子节点判定是否满足条件,满足加入结果。
最后排序就好。
#include <iostream>
#include <algorithm>
#include <climits>
#include <cstring>
#include <string>
#include <vector>
#include <map>
#include <queue>
#include <stack>
#define MAX 105
using namespace std;
struct Node{
int weight;
vector <int> next;
};
Node t[MAX];
int n,m,s;
vector <vector<int>> ans;
vector <int> patch;
void DFS(int root){
//跳进去
patch.push_back(t[root].weight);
if(t[root].next.size()==0){//到了叶子节点
int sum = 0;
for(int i = 0 ; i< patch.size();i++)
sum += patch[i];
if(sum == s)
ans.push_back(patch);
else
return;
}
for(int i = 0 ; i < t[root].next.size() ;i++){
DFS(t[root].next[i]);
patch.pop_back();
//跳出来
}
}
bool cmp(vector <int> v1,vector <int> v2){
return v1 > v2;
}
int main(){
scanf("%d%d%d",&n,&m,&s);
for(int i = 0 ;i < n ;i++)
scanf("%d",&t[i].weight);
int no,times;
for(int i =0 ; i < m;i++){
scanf("%d%d",&no,×);
int next;
for(int j = 0; j < times;j++){
scanf("%d",&next);
t[no].next.push_back(next);
}
}
DFS(0);
sort(ans.begin(),ans.end(),cmp);
for(int i =0 ;i < ans.size();i++){
printf("%d",ans[i][0]);
for(int j = 1 ; j < ans[i].size() ;j++)
printf(" %d",ans[i][j]);
printf("\n");
}
return 0;
}