G将军的敢死队
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。
请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。
输入格式
输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。
接下来n-1个数,分别表示编号为2, 3, …, n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。
#include <iostream>
int a[100001],b[100001];
int n,t;
using namespace std;
int ans=0;
int dfs(int t) {
if(t>n) {//已经选完了
ans++;
return ans;
}
if(a[b[t]]==0) {//如果他上级已经出列
dfs(t+1);
} else {//若没有 ,可以做两种判断
a[t]=0;
dfs(t+1);
a[t]=1;
dfs(t+1);
}
}
int main() {
int i,j;
scanf("%d",&n);
t=0;
a[0]=;
for(int i=1; i<=n; i++)
a[i]=i;
b[1]=0;
for(int i=2; i<=n; i++)
cin>>b[i];
printf("%d\n",(dfs(1)-1)%10007);
}
}```