可以将该问题转化为两个01背包,然后求他们相等且和的最大值。二维数组dp[x][y]代表两座塔高度是否合理,初始化dp[0][0]=1.利用三重循环得到递推公式:若dp[x-w[i]][y]==1或dp[x][y-w[i]]==1可以推出dp[x][y]=1。从高度之和一半循环到1判断dp[i][i]==1就输出i,否则输出"Impossible"
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
int n,sum=0;
int dp[1010][1010];
int w[1010];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
sum+=w[i];
}
dp[0][0]=1;
for(int i=1;i<=n;i++)
for(int x=sum/2;x>=0;x--)
for(int y=sum/2;y>=0;y--)
{
if(x-w[i]>=0)
{
if(dp[x-w[i]][y]==1) dp[x][y]=1;
}
if(y-w[i]>=0)
{
if(dp[x][y-w[i]]==1) dp[x][y]=1;
}
}
for(int i=sum/2;i>=1;i--)
{
if(dp[i][i]==1)
{
cout<<i<<endl;
return 0;
}
}
cout<<"Impossible";
return 0;
}

本文介绍了一种解决双塔构造问题的方法,通过转化为两个01背包问题,并使用动态规划来寻找最大相等高度的解决方案。文章详细阐述了算法的具体实现过程。
968

被折叠的 条评论
为什么被折叠?



