数列2

问题描述 :
思维的严密性是相当重要的,尤其是在程序设计中,一个小小的错误,就可能导致无法想象的后果。明明的爸爸是一名富有经验的程序设计专家,深知思维严密的重要性,于是在明明很小的时候,就通过游戏的方式,训练明明的思维严密性。今天,明明的爸爸和明明做了一个数列的游戏。这个游戏很简单,就是有一数列,现在需要在这数列中选出一个或者若干个数(可以不连续),要求这些数的和能被11整除。明明的爸爸想锻炼明明思维的严密性,因此要求明明尽可能多的找出符合条件的数列来,最好一个也不要漏掉。 例如一数列为“11 22 33”,其中11可以被11整除,22可以被11整除,33可以被11整除,11+22=33能被11整除,22+33=55能被11整除,11+33=44能被11整除,11+22+33=66能被11整除。所以以上一数列能被11整除的情况一共有7种。 明明对于这个游戏很感兴趣,高兴地玩了起来。由于粗心,明明总是无法一次就把所有的情况都找出来,这使得他爸爸不是很满意。于是明明爸爸决定先降低游戏的难度,事先告诉明明某一数列总共有多少种符合条件的选择数字的方法,然后再让明明去选。明明的爸爸请你帮一个忙,他不想自己找出所有的情况,因此请你写一个程序,用程序来找出一共有多少种符合选数的情况,并把结果告诉他。
明明爸爸的问题可以归结为:给你一个数列,从中选出1个或若干个数(可以不连续),要求这些数的和能被11整除,问这样的选数方法一共有多少种。

输入说明 :
你写的程序要求从标准输入设备中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据有两行,每组测试数据的第一行有一个整数n(1≤n≤15),表示数列中有多少个整数,每组测试数据的第二行有n个整数,整数的大小都大于等于0且小于等于100,整数之间用一个空格隔开。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。

输出说明 :
对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将每组运算结果作为你所写程序的输出数据依次写入到标准输出设备中。每组运算结果为一个整数,即表示一共有多少种选数方法。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。 注:通常,显示屏为标准输出设备。

输入范例 :
1
11
3
11 22 33

输出范例 :
1
7

使用递归
sum代表现在已经求得的和
index代表当前的下标
direction代表递归的方向,0代表递归树根节点,-1代表左左子树,考虑了当前元素,
1代表右字树,没有考虑当前元素,如果当前递归节点是右孩子节点,它的sum是与它的父节点一样的
因此不用重复计数

在这里插入图片描述

#include<stdio.h>

int arr[20];
int cnt;
int n;

/*
sum代表现在已经求得的和
index代表当前的下标
direction代表递归的方向,0代表递归树根节点,-1代表左左子树,考虑了当前元素,
1代表右字树,没有考虑当前元素,如果当前递归节点是右孩子节点,它的sum是与它的父节点一样的
因此不用重复计数 
*/
void DFS(int sum,int index,int direction){
	//递归出口 
	if(index==n+1){
		if(sum!=0&&sum%11==0&&direction!=1){
			cnt++;
		}
		return;
	}
	
	if(sum!=0&&sum%11==0&&direction!=1){
		cnt++;
	}
	DFS(sum+arr[index],index+1,-1); //考虑当前元素的情况
	DFS(sum,index+1,1);  //不考虑当前元素的情况 
	
}

int main(void){
	
	while(scanf("%d",&n)!=EOF){
		for(int i=1;i<=n;i++){
			scanf("%d",&arr[i]);
		}
		cnt=0;
		DFS(0,1,0);
		printf("%d\n",cnt);	
	}
	
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值