描述
世界末日马上就要来临了,当然,每个人都想买到船票,但是由于船票有限,因此需要回答对一个问题才能买票。问题是这样的:给你一个数n (1 <= n <= 10000),之后给n个正整数 (<=10000),问在这n个数中是否存在一些数的和是n的倍数。
输入
多组测试数据(最多100组)。首先输入一个数n,然后输入n个数。
输出
如果能找到一些数的和是n的倍数,输出"YES",否则输出"NO"。
样例输入
5
5 3 6 7 9
样例输出
YES
思路:打算写一个可以确定写多少层for循环的递归。例如如果先是遍历一个数是否是此数的倍数,如果不是,在弄成2个数相加,遍历整个数据。不成在3个相加。最后对了。。
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
int a=scan.nextInt();
int[] b=new int[a];
for(int i=0;i<a;i++){
b[i]=scan.nextInt();
}
int sum=0;
for(int i=0;i<b.length;i++){
sum+=b[i];
}
for(int i=1;i<=b.length;i++){
if(isYes!=1){
recursion(b,0,0,i,a);
}else{
System.out.println("YES");
break;
}
}
}
}
static int sum;
static int isYes;
//d是判断最多几层
//c是下一次循环开始的点
//e是除以的数
//b是现在是底几层
public static void recursion(int[] a,int b,int c,int d,int e){
if(isYes==1){
return;
}
if(b+1==d){
if(sum%e==0){
isYes=1;
}
return;
}
for(int i=c;i<a.length;i++){
if(isYes==1){
return;
}
sum+=a[i];
recursion(a,b+1,i,d,e);
sum-=a[i];
}
}
}
最后看到网上有说抽屉原理,所以这个题的答案必定是有。所以‘呕!’吐口血。