文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>母函数HDU Holding Bin-Laden Captive!

母函数HDU Holding Bin-Laden Captive!

时间:2010-09-20  来源:sysuwhj

这几天看了某大神写的关于母函数的文章,总算基本搞明白,就找这类题练练,这题是母函数变种

一开始WA了好几次,搞不懂原因, 后来发现原来我忽略了,不能最小的不能组合数 可以大于所有1,25的总和

 

<PRE class="brush: c++; auto-links: true; collapse: false; first-line: 1; gutter: false; html-script: false; light: false; ruler: false; smart-tabs: true; tab-size: 4; toolbar: true;">#include &lt;iostream&gt;

using namespace std;

int main()
{
        int n;
        int i, j, k;
        int addnum;

        int num[3];
        int a[8005];
        int b[8005];

        int firstboundary;
        int secondboundary;
        bool isfind = false;

    //freopen("C:\\Users\\Haojian\\Desktop\\test.txt", "r", stdin);

        cin &gt;&gt; num[0] &gt;&gt; num[1] &gt;&gt; num[2];
        

        while ( (num[0] || num[1] || num[2])) 
        {
                isfind = false;
                n = num[0] + num[1] * 2 + num[2] * 5;
                //各种初始化
                for (i = 0; i &lt;= n; i++) 
                {
                        a[i] = 0;
                        b[i] = 0;
                }

                for (i = 0; i &lt;= num[0]; i++)    
                        a[i] = 1;
                
                for ( i = 2; i &lt;= num[1] * 2; i += 2)
                    a[i] = 1;

                for ( i = 5; i &lt;= num[2] * 5; i += 5)
                        a[i] = 1;

                //母函数模板
                for (i = 2; i &lt;= 3; i++) //表示第i个多项式
                {
                        //设置每次的边界,和k加的次数
                        if (i == 3)
                        {
                                addnum = 5;
                                firstboundary = num[0] + num[1] * 2 ;
                                secondboundary = num[0] + num[1] * 2 + num[2] * 5;
                        }
                        else 
                        {
                                addnum = 2;
                                firstboundary = num[0];
                                secondboundary = num[0] + num[1]*2;
                        }

                        //多项式计算
                        for (j = 0; j &lt;= firstboundary; j++)
                        {       
                                
                                for (k = 0; k + j &lt;= secondboundary; k += addnum)//第i个多项式的每个项            
                                        b[j + k] += a[j];                               
                        }

                        for (k = 0; k &lt;= secondboundary; k++) 
                        {                               
                                a[k] = b[k];
                                b[k] = 0;
                        }

                }

                //查找答案输出
                for (i = 1; i &lt;=n; i++)
                {
                        if (a[i] == 0)
                        {
                                isfind = true;
                                cout &lt;&lt; i &lt;&lt; endl;
                                break;
                        }
                }
                //如果查找不到,意味着最小的不可能组合的数就为总数+1
                if (!isfind)
                        cout &lt;&lt; n+1 &lt;&lt; endl;

                cin &gt;&gt; num[0] &gt;&gt; num[1] &gt;&gt; num[2];
                
        }
        return 0;
        
}</PRE>
相关阅读 更多 +
排行榜 更多 +
别惹神枪手安卓版

别惹神枪手安卓版

冒险解谜 下载
坦克战争世界

坦克战争世界

模拟经营 下载
丛林反击战

丛林反击战

飞行射击 下载