class Main {
static int m, n;
static int max = Integer.MIN_VALUE;
public void DFS( int level, int sum, int[] arr) {
// 합이 조건을 초과하면 return, 이전 flag와 유사 역할.
if( sum > m) return;
// 기존의 실수 : 모든 경우의 수를 보기 전에 리턴 시키려 함.
// 그럴 필요가 없는 것이, LEVEL이 n이 되는 경우 안에 요소의 포함/미포함 경우의 수가 모두 존재함.
// 따라서 해당 경우에 값을 찾는 것이 낫다.
if( level == n) {
//System.out.println(String.format("level : %d sum: %d",level, sum));
max = Math.max(max, sum);
} else {
DFS(level+1, sum + arr[level] , arr);
DFS(level+1, sum, arr);
}
}
public static void main(String args[]) throws Exception {
Main M = new Main();
Scanner in = new Scanner(System.in);
m = in.nextInt();
n = in.nextInt();
int [] arr = new int[n];
for ( int i = 0 ; i < n ; ++i) {
arr[i] = in.nextInt();
}
M.DFS(0, 0, arr);
System.out.println(max);
}
}
ex)
input
259 5
81
58
42
33
61
output
242