题目链接:https://www.luogu.org/problem/show?pid=2423
题解:
没有一下子想到正确的状态定义,然后就开始各种YY,拿背包乱搞只错了一个点hhh
正解显然是DP
用
f[i][j]
表示前
i
个塔,双塔的差为
然后转移很好想,答案就是
f[n][0]
。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[110];
int f[110][2100];//前i个塔 双塔的差为j 的较低的塔的最大高度
int main()
{
cin>>n;
int sum=0;
for(int i=1;i<=n;i++) cin>>a[i],sum+=a[i];
memset(f,0xaf,sizeof(f));
f[0][0]=0;
for(int i=1;i<=n;i++)
for(int j=sum;j>=0;j--)
{
if(j>=a[i]) f[i][j]=max(f[i-1][j-a[i]]+a[i],f[i-1][j+a[i]]);
else f[i][j]=max(f[i-1][a[i]-j]+j,f[i-1][j+a[i]]);
f[i][j]=max(f[i][j],f[i-1][j]);
}
if(f[n][0]==0) cout<<"Impossible" << endl;
else cout<<f[n][0];
return 0;
}