[Vijos1037]搭建双塔

两个背包来防止重复。。

 

#include
#include 
bool dp[2000][2000];
int h[2000]; 
int main()
{
    memset(dp,0,sizeof(dp)); 
    int n,suma=0;
    dp[0][0]=true; 
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    { 
        scanf("%d",&h[i]); sum+=h[i];
    } 
    for(int i=1;i<=n;i++)
        for(int j=sum/2;j>=0;j--)
            for(int k=sum/2;k>=0;k--)
            { 
                if(j-h[i]>=0) 
                dp[j][k]=dp[j][k]|dp[j-h[i]][k];
                if(k-h[i]>=0) 
                dp[j][k]=dp[j][k]|dp[j][k-h[i]];
            } 
    for(int i=sum/2+1;i>=1;i--)
        if(dp[i][i])
        {
            printf("%d",i);
            return 0;
        } 
        printf("Impossible\n"); 
        return 0;
} 
         


你可能感兴趣的:([Vijos1037]搭建双塔)