背包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;
}