p1315

题意就是对于n个数字构成两个相等的数的方案中 能构成的最大的数是多少.

首先当然可以暴力dfs拿不了多少分.看到塔的总高度不大,我们可以考虑动态规划中的背包.

设flag[i][f]表示状态.如果等于一说明第一个数是i第二个是f的情况可以达到.那么对于每个高度th可以枚举所有可能的状态,如果有flag[i][f]==1,那么flag[i+th][f]于flag[i][f+th]都可以为1.

这样子三重循环可以在<=100*2000*2000里完成枚举.看上去好像超时了.这个时候可以写一个小优化:先把所有高度存起来后sort,然后从小到大枚举.每次枚举的范围显然只需要到达当前的和就好.

int i,f,j;
int n,sum,o[110],t;
int flag[2010][2010];
int main()
{
    n=read();
    flag[0][0]=1;
    for(i=1;i<=n;i++)
        o[i]=read();
    sort(o+1,o+1+n);
    for(i=1;i<=n;i++)
    {
        for(f=sum;f>=0;f--)
            for(j=sum;j>=0;j--)
                if(flag[f][j])
                    flag[f][j+o[i]]=flag[f+o[i]][j]=1;
        sum+=o[i];
    }
    for(i=sum;i>0;i--)
        if(flag[i][i])
        {
            write(i);
            return 0;
        }
    cout<<"Impossible";
    return 0;
}
原文地址:https://www.cnblogs.com/qywyt/p/9988244.html