Vijos P1037 - 搭建双塔

传送门

Vijos P1037 - 搭建双塔

思路

参考了别人的题解。

用$dp[i][j]$, i和j表示两座塔的高度,值为1或者0。

枚举所有两座塔的高度,最后取最大的dp[i][i]即可。

代码

#include <bits/stdc++.h>
using namespace std;
#define LL long long
#define MP(a, b) make_pair(a, b)
const int MAXN = 2000 + 10;
const int INF = 0x3f3f3f3f;
 
int dp[MAXN][MAXN];
 
int main()
{
    //freopen("input.txt", "r", stdin);
    int n, i, j, cur = 0, a;
    scanf("%d", &n);
    dp[0][0] = 1;
    for (i = 0; i < n; i++)
    {
        scanf("%d", &a);
        for (j = cur; j >= 0; j--)
            for (int k = cur; k >= 0; k--)
            {
                dp[j + a][k] |= dp[j][k];
                dp[j][k + a] |= dp[j][k];
            }
        cur += a;
    }
    for (i = cur; i >= 1; i--)
        if (dp[i][i])
        {
            printf("%d\n", i);
            return 0;
        }
    printf("Impossible\n");
    return 0;
}

Powered by Jekyll and Theme by solid