题意
用一些有固定高度的方块堆成两座相同高度的塔,问塔最高高度。
状态转移方程
双进程dp
f[j][k]代表一个塔高度为j,另一个塔高度为k的情况是否存在
f
[
j
]
[
k
]
代
表
一
个
塔
高
度
为
j
,
另
一
个
塔
高
度
为
k
的
情
况
是
否
存
在
我们可以轻易得出:
f[j][k]=f[j−a[i]][k] || f[j][k−a[i]]
f
[
j
]
[
k
]
=
f
[
j
−
a
[
i
]
]
[
k
]
|
|
f
[
j
]
[
k
−
a
[
i
]
]
code
#include<bits/stdc++.h>
using namespace std;
inline int read()
{
int num = 0;
char c = ' ';
bool flag = true;
for(;c > '9' || c < '0';c = getchar())
if(c == '-')
flag = false;
for(;c >= '0' && c <= '9';num = num*10+c-48,c=getchar());
return flag ? num : -num;
}
const int maxn=105;
int n,a[maxn],sum=0;
void init()
{
n=read();
for(int i=1;i<=n;i++)
a[i]=read(),sum+=a[i];
}
const int max_height=2020;
bool f[max_height][max_height];
void DP()
{
f[0][0]=true;
for(int i=1;i<=n;i++)
for(int j=sum-a[i];j>=0;j--)
for(int k=sum-a[i];k>=0;k--)
if(f[j][k])
{
f[j+a[i]][k]=f[j][k+a[i]]=true;
}
for(int i=sum/2;i>=1;i--)
if(f[i][i])
{
printf("%d\n",i);
exit(0);
}
printf("Impossible\n");
}
int main()
{
init();
DP();
return 0;
}