https://codeforces.com/contest/1472/problem/B
Problem - B - Codeforces
codeforces.com
[난이도] Div.3
[유형] DP
[풀이]
전체 합이 홀수인지, 짝수인지를 따져가며 풀이도 있는데 생각이 안나서 DP로 풀었다.
DP(n1,n2) : 1이 n1개, 2가 n2개 남았을 때 캔디를 동일하게 분배가 가능하면 true, 아니면 false
DP(n1,n2) = DP(n1-2,n2) A에게 1을 1개, B에게 1을 1개 준 경우
|| DP(n1-2,n2-1) A에게 1을 2개, B에게 2를 1개 준 경우
|| DP(n1,n2-2) A에게 2를 1개, B에게 2를 1개 준 경우
(위 세가지 케이스중 한가지만 true여도 DP(n1,n2)는 true가 된다.)
#include <cstdio>
#include <cstring>
int tc,N,a[3],dp[101][101];
int sol(int n1,int n2){
int& ret=dp[n1][n2];
if(ret!=-1) return ret;
if(n1==0&&n2==0) return ret=1;
if(n1-2>=0 && sol(n1-2,n2)) return ret=1;
if(n1-2>=0 && n2-1>=0 && sol(n1-2,n2-1)) return ret=1;
if(n2-2>=0 && sol(n1,n2-2)) return ret=1;
return ret=0;
}
int main(){
scanf("%d",&tc);
while(tc--){
scanf("%d",&N);
a[1]=a[2]=0;
while(N--){
int v;
scanf("%d",&v);
a[v]++;
}
memset(dp,-1,sizeof(dp));
if(sol(a[1],a[2])) puts("YES");
else puts("NO");
}
}
https://github.com/has2/Problem-Solving/blob/master/codeforces/Round693-Div.3/B.cpp