派遣敢死队
来源:互联网 发布:知乎日报与读读日报 编辑:程序博客网 时间:2024/04/29 01:58
G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。
请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。
输入格式
输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。
接下来n-1个数,分别表示编号为2, 3, ..., n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。
输出格式
输出一个整数,表示派出敢死队的方案数。由于数目可能很大,你只需要输出这个数除10007的余数即可。
参考代码:
暴力求解:
#include<stdio.h>#include<stdlib.h>#include<math.h>int main(){int n,*a;int i,count=0,j;int *b,temp,flag;scanf("%d",&n);a=(int*)malloc(sizeof(int)*n);b=(int*)malloc(sizeof(int)*n);a[0]=0;for(i=1;i<n;i++)scanf("%d",&a[i]);for(i=0;i<pow(2,n);i++){temp=i;for(j=0;j<n;j++){b[j]=temp%2;temp/=2;}flag=1;for(j=0;j<n;j++){if(b[j]&&b[a[j]-1]){flag=0;break;}}if(flag){count++;count%=10007;}}printf("%d\n",count);return 0;}回溯法:
#include<stdio.h>#include<stdlib.h>#include<math.h>int n,*a,*b;int count=0;void backtrack(int t){int i,flag=1;if(t==n){count++;count%=10007;}else{for(i=0;i<2;i++){b[t]=i;if(!(b[t]&&b[a[t]-1])||t==0)backtrack(t+1);}}}int main(){int i,j;int temp,flag;scanf("%d",&n);a=(int*)malloc(sizeof(int)*n);b=(int*)malloc(sizeof(int)*n);a[0]=0;for(i=1;i<n;i++)scanf("%d",&a[i]);backtrack(0);printf("%d\n",--count);return 0;}
0 0
- 派遣敢死队
- 派遣敢死队
- 派遣敢死队
- 派遣敢死队
- 蓝桥杯校内选拔赛 派遣敢死队
- 第六届蓝桥杯校园选拔赛试题---派遣敢死队 解题报告
- 蓝桥杯——派遣敢死队问题—C语言
- 《敢死队》
- 敢死队
- 敢死队
- 螃蟹敢死队
- 敢死队问题
- 《敢死队》观后感
- 敢死队中文翻译
- 敢死队问题
- 不敢死队
- 不敢死队
- 派遣函数
- 比酒量
- LVDS数据接口传输
- Redis的快照功能
- Spring session 小例子运行
- luncene 查询字符串的解析
- 派遣敢死队
- matlab 扩大虚拟内存
- Nginx Rewrite可以用到的全局变量
- Oracle开发jdbc thin与 oci 连接方式的字符集设置
- Redis的AOF功能
- Android仿微信(一)——仿微信之界面导航篇
- delphi 与 sqlite 参考
- RouterPassView——路由器密码查看工具
- jdk学习记录