@sxd666888救我
by 赵灵儿 @ 2018-03-26 19:53:18
@ sxd666888
by 赵灵儿 @ 2018-03-26 19:53:35
@[无比自信](/space/show?uid=90659)
by 赵灵儿 @ 2018-03-26 19:53:58
@[sxd666888](/space/show?uid=84156)
by 赵灵儿 @ 2018-03-26 19:54:23
已过但不知道为什么
```cpp
#include <bits/stdc++.h>
using namespace std;
int n, a[55], f[55][500005], top;
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
top += a[i];
}
sort (a + 1, a + n +1);
memset( f, -3, sizeof f);
f[0][0] = 0;
for (int i = 1; i <= n; i++) {
for (int j = top; j >= 0; j--) {
f[i][j] = max (f[i][j], f[i-1][j]);
f[i][j] = max (f[i][j], f[i-1][j + a[i]]);
if (a[i] > j) {
f[i][j] = max (f[i][j], f[i-1][a[i] - j] + j);
}
if (a[i] <= j) {
f[i][j] = max (f[i][j], f[i-1][j - a[i]] + a[i]);
}
}
}
if(f[n][0] <= 0) {
printf("%d\n", -1);
}
else {
printf("%d\n", f[n][0]);
}
return 0;
}
```
by 赵灵儿 @ 2018-03-26 19:58:00
# 如果有的差距你根本取不到,就会不满足,最高塔的高度至少要比差距大吧
```cpp
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int f[51][500001],n,a[51],sum=0;
int main()
{
freopen("tower.in","r",stdin);
freopen("tower.out","w",stdout);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
f[0][0]=0;
for(int i=1;i<=n;i++)//处理了前n个
{
for(int j=0;j<=250000;j++)
{
f[i][j]=f[i-1][j];
if(f[i-1][j+a[i]]>=j+a[i])
{
f[i][j]=max(f[i][j],f[i-1][j+a[i]]);
}
if(a[i]<=j)
{
if(f[i-1][j-a[i]]>=j-a[i])
{
f[i][j]=max(f[i][j],f[i-1][j-a[i]]+a[i]);
}
}
else
{
if(f[i-1][a[i]-j]>=a[i]-j)
{
f[i][j]=max(f[i][j],f[i-1][a[i]-j]+j);
}
}
}
}
if(f[n][0])
{
cout<<f[n][0];
}else
{
cout<<"-1";
}
return 0;
}
```
by 闫灿宇123 @ 2020-11-17 21:39:58