

import java.util.*;
public class Main {
static String answer = "NO";
static int n, total = 0;
boolean flag = false;
public void DFS(int L, int sum, int[] arr){
if(flag) return;
if(sum > total / 2) return;
if(L == n) {
if((total - sum) == sum){
answer = "YES";
flag = true;
}
}
else {
DFS(L + 1, sum + arr[L], arr);
DFS(L + 1, sum, arr);
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = kb.nextInt();
total += arr[i];
}
T.DFS(0, 0, arr);
System.out.println(answer);
}
}

sum : 트럭에 타는 강아지 무게 총합
import java.util.*;
public class Main {
static int answer = Integer.MIN_VALUE, c, n;
public void DFS(int L, int sum, int[] arr){
if(sum > c) return;
if(L == n){
answer = Math.max(answer, sum);
}
else{
DFS(L + 1, sum + arr[L], arr);
DFS(L + 1, sum, arr);
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
c = kb.nextInt();
n = kb.nextInt();
int[] arr = new int[n];
for(int i = 0; i < n; i++){
arr[i] = kb.nextInt();
}
T.DFS(0, 0, arr);
System.out.println(answer);
}
}

import java.util.*;
public class Main {
static int answer = Integer.MIN_VALUE, n, m;
boolean flag = false;
public void DFS(int L, int sum, int time, int[] ps, int[] pt){
if(time > m) return;
if(L == n){
answer = Math.max(answer, sum);
}
else{
DFS(L + 1, sum + ps[L], time + pt[L], ps, pt);
DFS(L + 1, sum, time, ps, pt);
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
int[] a = new int[n];
int[] b = new int[n];
for(int i = 0; i < n; i++){
a[i] = kb.nextInt();
b[i] = kb.nextInt();
}
T.DFS(0, 0, 0, a, b);
System.out.println(answer);
}
}

import java.util.*;
public class Main {
static int[] pm;
static int n, m;
public void DFS(int L){
if(L == m){
for(int x : pm) {
System.out.print(x + " ");
}
System.out.println();
}
else{
for(int i = 1; i <= n; i++){
pm[L] = i;
DFS(L + 1);
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
pm = new int[m];
T.DFS(0);
}
}

L : 사용된 동전의 개수
sum : L개의 동전으로 만든 총합(원)
import java.util.*;
public class Main {
static int n, m, answer = Integer.MAX_VALUE;
public void DFS(int L, int sum, Integer[] arr){
if(sum > m) return;
if(L >= answer) return;
if(sum == m){
answer = Math.min(answer, L);
}
else{
for(int i = 0; i < n; i++){
DFS(L + 1, sum + arr[i], arr);
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
Integer[] arr = new Integer[n];
for(int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
Arrays.sort(arr, Collections.reverseOrder());
m = kb.nextInt();
T.DFS(0, 0, arr);
System.out.println(answer);
}
}

import java.util.*;
public class Main {
static int[] pm, ch, arr;
static int n, m;
public void DFS(int L){
if(L == m){
for(int x : pm) {
System.out.print(x + " ");
}
System.out.println();
}
else{
for(int i = 0; i < n; i++){
if(ch[i] == 0){
ch[i] = 1;
pm[L] = arr[i];
DFS(L + 1);
ch[i] = 0;
}
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
arr = new int[n];
for(int i = 0; i < n; i++) {
arr[i] = kb.nextInt();
}
ch = new int[n];
pm = new int[m];
T.DFS(0);
}
}

import java.util.*;
public class Main {
int[][] dy = new int[35][35];
public int DFS(int n, int r){
if(dy[n][r] > 0) {
return dy[n][r];
}
if(n == r || r == 0) {
return 1;
}
else {
return dy[n][r] = DFS(n - 1, r - 1) + DFS(n - 1, r);
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
int r = kb.nextInt();
System.out.println(T.DFS(n, r));
}
}


import java.util.*;
public class Main {
static int[] b, p, ch;
static int n, f;
boolean flag = false;
int[][] dy = new int[35][35];
public int combi(int n, int r) {
if(dy[n][r] > 0) {
return dy[n][r];
}
if(n == r || r == 0) {
return 1;
}
else {
return dy[n][r] = combi(n - 1, r - 1) + combi(n - 1, r);
}
}
public void DFS(int L, int sum) {
if(flag) return;
if(L == n) {
if(sum == f){
for(int x : p) {
System.out.print(x + " ");
}
flag = true;
}
}
else{
for(int i = 1; i <= n; i++){
if(ch[i] == 0){
ch[i] = 1;
p[L] = i;
DFS(L + 1, sum + (p[L] * b[L]));
ch[i] = 0;
}
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
f = kb.nextInt();
b = new int[n];
p = new int[n];
ch = new int[n + 1];
for(int i = 0; i < n; i++){
b[i] = T.combi(n - 1, i);
}
T.DFS(0, 0);
}
}

import java.util.*;
public class Main {
static int[] combi;
static int n, m;
public void DFS(int L, int s) {
if(L == m) {
for(int x : combi) {
System.out.print(x + " ");
}
System.out.println();
}
else {
for(int i = s; i <= n; i++) {
combi[L] = i;
DFS(L + 1, i + 1);
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
combi = new int[m];
T.DFS(0, 1);
}
}


import java.util.*;
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] board;
static int answer = 0;
public void DFS(int x, int y) {
if(x == 7 && y == 7) {
answer++;
}
else {
for(int i = 0; i < 4; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
board[nx][ny] = 1;
DFS(nx, ny);
board[nx][ny] = 0;
}
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
board = new int[8][8];
for(int i = 1; i <= 7; i++) {
for(int j = 1; j <= 7; j++) {
board[i][j] = kb.nextInt();
}
}
board[1][1] = 1;
T.DFS(1, 1);
System.out.print(answer);
}
}


import java.util.*;
class Point {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] board, dis;
public void BFS(int x, int y) {
Queue<Point> Q = new LinkedList<>();
Q.offer(new Point(x, y));
board[x][y] = 1;
while(!Q.isEmpty()) {
Point tmp = Q.poll();
for(int i = 0; i < 4; i++) {
int nx = tmp.x + dx[i];
int ny = tmp.y + dy[i];
if(nx >= 1 && nx <= 7 && ny >= 1 && ny <= 7 && board[nx][ny] == 0) {
board[nx][ny] = 1;
Q.offer(new Point(nx, ny));
dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
}
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
board = new int[8][8];
dis = new int[8][8];
for(int i = 1; i <= 7; i++) {
for(int j = 1; j <= 7; j++) {
board[i][j] = kb.nextInt();
}
}
T.BFS(1, 1);
if(dis[7][7] == 0) {
System.out.println(-1);
}
else {
System.out.println(dis[7][7]);
}
}
}


import java.util.*;
class Point {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int[] dx = {-1, 0, 1, 0};
static int[] dy = {0, 1, 0, -1};
static int[][] board, dis;
static int n, m;
static Queue<Point> Q = new LinkedList<>();
public void BFS() {
while(!Q.isEmpty()) {
Point tmp = Q.poll();
for(int i = 0; i < 4; i++) {
int nx = tmp.x + dx[i];
int ny = tmp.y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < m && board[nx][ny] == 0) {
board[nx][ny] = 1;
Q.offer(new Point(nx, ny));
dis[nx][ny] = dis[tmp.x][tmp.y] + 1;
}
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
m = kb.nextInt();
n = kb.nextInt();
board = new int[n][m];
dis = new int[n][m];
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
board[i][j] = kb.nextInt();
if(board[i][j] == 1) {
Q.offer(new Point(i, j));
}
}
}
T.BFS();
boolean flag = true;
int answer = Integer.MIN_VALUE;
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
if(board[i][j] == 0) {
flag = false;
}
}
}
if(flag) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < m; j++) {
answer = Math.max(answer, dis[i][j]);
}
}
System.out.println(answer);
}
else {
System.out.println(-1);
}
}
}


import java.util.*;
public class Main {
static int answer = 0, n;
static int[] dx = {-1, -1, 0, 1, 1, 1, 0, -1};
static int[] dy = {0, 1, 1, 1, 0, -1, -1, -1};
public void DFS(int x, int y, int[][] board) {
for(int i = 0; i < 8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny < n && board[nx][ny] == 1) {
board[nx][ny] = 0;
DFS(nx, ny, board);
}
}
}
public void solution(int[][] board) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == 1) {
answer++;
board[i][j] = 0;
DFS(i, j, board);
}
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
int[][] arr = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
arr[i][j] = kb.nextInt();
}
}
T.solution(arr);
System.out.println(answer);
}
}


import java.util.*;
class Point {
int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int answer = 0, n;
static int[] dx = {-1, -1, 0, 1, 1, 1, 0, -1};
static int[] dy = {0, 1, 1, 1, 0, -1, -1, -1};
Queue<Point> queue = new LinkedList<>();
public void BFS(int x, int y, int[][] board) {
queue.add(new Point(x, y));
while(!queue.isEmpty()) {
Point pos = queue.poll();
for(int i = 0; i < 8; i++) {
int nx = pos.x + dx[i];
int ny = pos.y + dy[i];
if(nx >= 0 && nx < n && ny >= 0 && ny<n && board[nx][ny] == 1) {
board[nx][ny] = 0;
queue.add(new Point(nx, ny));
}
}
}
}
public void solution(int[][] board) {
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
if(board[i][j] == 1) {
answer++;
board[i][j] = 0;
BFS(i, j, board);
}
}
}
}
public static void main(String[] args){
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
int[][] arr = new int[n][n];
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
arr[i][j] = kb.nextInt();
}
}
T.solution(arr);
System.out.println(answer);
}
}


import java.util.*;
class Point {
public int x, y;
Point(int x, int y) {
this.x = x;
this.y = y;
}
}
public class Main {
static int n, m, len, answer = Integer.MAX_VALUE;
static int[] combi;
static ArrayList<Point> hs, pz;
public void DFS(int L, int s) {
if(L == m) {
int sum = 0;
for(Point h : hs) {
int dis = Integer.MAX_VALUE;
for(int i : combi) {
dis = Math.min(dis, Math.abs(h.x - pz.get(i).x) + Math.abs(h.y - pz.get(i).y));
}
sum += dis;
}
answer=Math.min(answer, sum);
}
else {
for(int i = s; i < len; i++) {
combi[L] = i;
DFS(L + 1, i + 1);
}
}
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
n = kb.nextInt();
m = kb.nextInt();
pz = new ArrayList<>();
hs = new ArrayList<>();
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
int tmp = kb.nextInt();
if(tmp == 1) {
hs.add(new Point(i, j));
}
else if(tmp == 2) {
pz.add(new Point(i, j));
}
}
}
len = pz.size();
combi = new int[m];
T.DFS(0, 0);
System.out.println(answer);
}
}