• 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;
    }
  • 相关阅读:
    Java calendar类学习笔记
    Anaconda 学习笔记
    第八周作业
    第七次作业
    第六周作业
    第五次作业
    用户调研方法之焦点小组
    第三周作业
    软件工作量的评估方法有哪些
    软件质量保证与测试(--作业--)
  • 原文地址:https://www.cnblogs.com/qywyt/p/9988244.html
Copyright © 2020-2023  润新知