SCU - 4512
有若干个积木,你可以选择将他放在 A塔,放在 B塔,或者不放
求在两塔高度相等的情况下,所能达到的最大高度
#include<stdio.h>
#include<iostream>
#include<algorithm>
#include<string.h>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
typedef long long LL;
using namespace std;
int dp[2][500050];
int cub[55];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
int maxs=-1;
for(int i=1;i<=n;i++)
{
scanf("%d",&cub[i]);
maxs+=cub[i];
}
memset(dp,128,sizeof dp);
//dp[0][0]=0;
int cur=0;
dp[0][0]=0;
for(int i=1;i<=n;i++)
{
int now=cur^1;//滚动数组,1^1=0 0^1=1;
int per=cur;
cur^=1;
for(int d=0;d<=maxs;d++)//dp[i][d] 前i个方块 两个塔的差值为d时 高的塔的最大高度
{
dp[now][d]=dp[per][d];// 第i块积木不放
if(d<=cub[i])
{
dp[now][d]=max(dp[now][d],dp[per][cub[i]-d]+cub[i]-d);
if(d+cub[i]<=maxs)
dp[now][d]=max(dp[now][d],dp[per][d+cub[i]]+cub[i]);
}
else
{
dp[now][d]=max(dp[now][d],dp[per][d-cub[i]]);
if(d+cub[i]<=maxs)
dp[now][d]=max(dp[now][d],dp[per][d+cub[i]]+cub[i]);
}
}
}
if(dp[cur][0]<=0)
puts("GG");
else
cout<<dp[cur][0]<<endl;
}
}