背包dp的解法
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 21;
bool dp[MAXN][MAXN][MAXN][MAXN];
int main(int argc, char *argv[])
{
dp[0][0][0][0] = true;
for (int i = 1; i <= 20; ++i)
{
for (int j = 0; j <= i; ++j)
{
for (int k = 0; k <= i; ++k)
{
for (int l = 0; l <= i; ++l)
{
if (j && dp[i - 1][j - 1][k][l])dp[i][j][k][l] = true;
if (k && dp[i - 1][j][k - 1][l])dp[i][j][k][l] = true;
if (l && dp[i - 1][j][k][l - 1])dp[i][j][k][l] = true;
if (j && k && dp[i - 1][j - 1][k - 1][l])dp[i][j][k][l] = true;
if (k && l && dp[i - 1][j][k - 1][l - 1])dp[i][j][k][l] = true;
if (l && j && dp[i - 1][j - 1][k][l - 1])dp[i][j][k][l] = true;
}
}
}
}
int T;
scanf("%d", &T);
while (T--)
{
int a, b, c, n;
scanf("%d %d %d %d", &n, &a, &b, &c);
printf(dp[n][a][b][c] ? "Yes\n" : "No\n");
}
return 0;
}