小葱同学擅长计算,尤其擅长计算一个数是否是另外一个数的倍数。但小葱只擅长两个数的情况,当有很多个数之后就会比较苦恼。
现在小葱给了你 n 个数,希望你从这 n 个数中找到三个数,
使得这三个数的和是 K 的倍数,且这个和最大。数据保证一定有解。
【输入格式】
从标准输入读入数据。
第一行包括 2 个正整数 n,K。
第二行 n 个正整数,代表给定的 n 个数。
【输出格式】
输出到标准输出。
输出一行一个整数代表所求的和。
【样例入】
4 3
1 2 3 4
【样例输出】
9
【样例解释】
选择2、3、4
深搜
import java.util.Scanner;
public class DFS {
static int max = -1; //记录最大值
static int n,k;
static int[] num = new int[100010];
static int[] mark = new int[4]; //记录每一步存储的数字
static boolean[] flag = new boolean[100010]; //给num一个标记位 是否被使用过
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
n = sc.nextInt();
k = sc.nextInt();
for(int i = 0; i<n;i++) {
num[i] = sc.nextInt();
}
dfs(0);
System.out.println(max);
}
//使用深搜
public static void dfs(int step) {
//判断结束条件
if(step == 3) {
int temp = mark[0]+mark[1]+mark[2];
if(temp%k==0) {
max = Math.max(max, temp);
return ;
}
}
for(int i = 0;i<n;i++) {
if(!flag[i]) { //如果i还没有被记录过
flag[i] = true; //给 这个数字设置标志位
mark[step] = num[i]; //在mark中存储 这一位数字
dfs(step+1);
flag[i] = false; //循环结束 释放标记位
}
}
}
}