题意就是对于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; }