Quick actions

cmd+k|ctrl+k

Navigation

Languages

더하기

Snippet info

Language

C

Visibility

public

Author

ludia

Created

2022-11-25T14:53:25.033886Z

Updated

2022-11-25T14:53:25.033886Z

#include <stdio.h>
 
#define MAXN (20)
int N, K;//자연수 개수, 만들값
int A[MAXN + 10];//자연수 값
int rec[MAXN + 10];//기록(디버깅용)
int presum[MAXN + 10];//prefix sum
 
int flag;//합계가 K인지 성공여부를 체크
char *msg[] = { "NO", "YES" };
 
void InputData(void) {
    scanf("%d %d", &N, &K);
    for (int i = 1; i <= N; i++) {
        scanf("%d", &A[i]);
    }
}
#if 0
int DFS(int cnt, int start, int sum) {//sum이 k가 되는 모든 경우의 수 시도
    if (sum == K) {
        //for (int i = 1; i <= N; i++) printf("%d ", rec[i]); printf("\n");
        flag = 1;
        return;
    }
    if (sum > K) return;//가지치기
    if (cnt > N || start > N) return;
    for (int i = start; i <= N; i++) {//A배열의 정수
        rec[cnt] = A[i];//기록
        DFS(cnt + 1, i + 1, sum + A[i]);
        rec[cnt] = 0;
    }
}
#else
int DFS(int cnt, int start, int sum) {//sum이 k가 되는 모든 경우의 수 시도
    if (K > sum + presum[N] - presum[start - 1]) return 0;//남은 정수를 모두 더해도 K가 될수 없다면 가지치기
    if (sum == K) return 1;//성공
    if (sum > K) return 0;
    if (cnt > N || start > N) return 0;
    for (int i = start; i <= N; i++) {//A배열의 정수
        if (DFS(cnt + 1, i + 1, sum + A[i]) == 1) return 1;
    }
    return  0;//실패
}
#endif
 
int Solve(void) {
    int i, ans;
    for (i = 1; i <= N; i++) {
        presum[i] = presum[i-1] + A[i];
    }
    //flag = 0;
    //DFS(1, 1, 0);//1개부터 시작, A[0]번부터 시작, 합계는 0
    ans = DFS(1, 1, 0);
    return ans;
}
int main(void) {
    int T, t, ans;
    scanf("%d", &T);
    for (t = 1; t <= T; t++) {
        InputData();//입력
        ans = Solve();
        printf("%s\n", msg[ans]);//출력
    }
    return 0;
}
INFO