派遣敢死队

 问题描述:       G将军有一支训练有素的军队,这个军队除开G将军外,每名士兵都有一个直接上级(可能是其他士兵,也可能是G将军)。现在G将军将接受一个特别的任务,需要派遣一部分士兵(至少一个)组成一个敢死队,为了增加敢死队队员的独立性,要求如果一名士兵在敢死队中,他的直接上级不能在敢死队中。请问,G将军有多少种派出敢死队的方法。注意,G将军也可以作为一个士兵进入敢死队。

       输入的第一行包含一个整数n,表示包括G将军在内的军队的人数。军队的士兵从1至n编号,G将军编号为1。接下来n-1个数,分别表示编号为2, 3, ..., n的士兵的直接上级编号,编号i的士兵的直接上级的编号小于i。

 

思路:建立一个数组a代表士兵编号为a数组下标的士兵的直接上级;建立一个数组b表示士兵编号为b数组下标的士兵参加还是不参加敢死队,b数组只有两个数,0代表不参加,1代表参加。n个士兵一共有2^n种派遣方法,但是题目中给出条件为:如果一名士兵在敢死队中,他的直接上级不能在敢死队中。

 

#include<stdio.h>
#include<math.h>

int main()
{
	int n;
	int i;
	int num,temp;
	int a[100];    //a数组表示士兵的直接上级 
	int b[100];    //b数组只有0和1表示编号为下标的士兵去还是不去,0代表不去,1代表去 
	int count=0;
	int flag;
///	printf("输入包括G将军在内的军队的人数:\n");
	scanf("%d",&n);
	a[1]=0;    //表示G将军没有直接上级 
	b[0]=1;   
	for(i=2;i<=n;i++)
		scanf("%d",&a[i]);
	
	for(num=0;num<pow(2,n);num++)
	{
		temp=num;
		
		for(i=1;i<=n;i++)   //对b数组进行赋值,0代表不去,1代表去 
		{
			b[i]=temp%2;
			temp/=2;	
		}
		flag=1;
		for(i=n;i>=1;i--)
		{
			if(b[i]&&b[a[i]])   //如果该士兵去了 ,他的直接上级也去了,不符合条件,flag=0
			{
				flag=0;
				break;
			 } 		
		}
		if(flag)
			count++;
	}
	printf("%d\n",count);
	
	return 0;
}

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值