더하기

Run Settings
LanguageC
Language Version
Run Command
#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; }
Editor Settings
Theme
Key bindings
Full width
Lines