42 数列2

42 数列2

作者: frankhuhu时间限制: 10S章节: 一维数组

问题描述 :

思维的严密性是相当重要的,尤其是在程序设计中,一个小小的错误,就可能导致无法想象的后果。明明的爸爸是一名富有经验的程序设计专家,深知思维严密的重要性,于是在明明很小的时候,就通过游戏的方式,训练明明的思维严密性。今天,明明的爸爸和明明做了一个数列的游戏。这个游戏很简单,就是有一数列,现在需要在这数列中选出一个或者若干个数(可以不连续),要求这些数的和能被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

 

这道题目是典型的序列组合问题(枚举从N个整数中选择K个数的所有方案,根据题目要求锁定最优方案)。
我们来分析,假设有5个数,那么选择的方案可以分为5中,如下:
1、选择1个数
2、选择两个数
3、选择3个数
4、选择4个数
5、选择5个数。
举一个例子,选择三个数的方案用变量k记录我们要选择的个数。
那么对于这5个数来说,面对每个数,我们都有两种选择,选择或者放弃(这是主要的递归体(子问题))。
边界呢?(“死胡同”)——当前判断的数组索引已经越界或者当前已经满足题目最优要求
这样,我们可以写出题目的代码了。
 1 #include <stdio.h>
 2 
 3 
 4 #define maxn 30
 5 
 6 int n,k;
 7 int ans = 0;//全局变量,最终的答案 
 8 int rec[maxn];
 9 
10 void DFS(int index,int nowk,int sum);
11 
12 int main(){
13     
14     
15     int i,j;
16     while(scanf("%d",&n)!=EOF){
17         for(i=0;i<n;i++){
18             scanf("%d",rec+i);
19         }
20         ans = 0;//更新每次的初值 
21         for(k=1;k<=n;k++){
22             DFS(0,0,0);
23         }
24         printf("%d\n",ans);
25     }
26     
27 
28     
29     
30     return 0;
31 } 
32 
33 
34 void DFS(int index,int nowk,int sum){
35 
36     if(nowk == k&&sum%11==0&&sum!=0){//该方案已经满足“最优要求” 
37         ans++; 
38         return ;
39     }
40     
41     if(index == n||nowk>k){
42         return ;//死胡同 
43     }
44     //岔道口 
45     DFS(index+1,nowk,sum);    //不选择第index件物品
46 
47 
48     DFS(index+1,nowk+1,sum+rec[index]);    //选择第index件物品     
49 
50     
51 }

 

posted @ 2020-03-23 15:40  focusDing  阅读(456)  评论(0编辑  收藏  举报