首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

动态规划 花生米有关问题

2012-05-16 
动态规划 花生米问题描述:五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库……

动态规划 花生米问题
描述:


五一长假第三天,Tom和Jerry在仓库散步的时候又发现了一堆花生米(仓库,又见仓库……)。这次Tom制定分花生米规则如下: 
???????1、Tom和Jerry轮流从堆中取出k粒花生米吃掉; 
2、第一次取花生米的人只能取一粒,以后取花生米的数量不能超过前一个人取花生米数量的两倍; 
3、为显示规则的公平性,Jerry可以选择先取或者后取。 
Jerry当然还是希望最后一粒花生米被Tom吃掉。请计算,Jerry为了达到目的应该先取还是后取。


输入:


本题有多个测例,每个测例的输入是一个整数n,n大于零小于等于1000,代表花生米的数量。
n等于0表示输入结束,不需要处理。

输出:


每个测例在单独的一行内输出一个整数:Jerry先取输出1;Tom先取输出0。 
我的想法是根据花生米个数n建立一个布尔变量的数组p,初始p[0]为零,其后根据情况取反或不变最后输出p[n-1],我的想法在做花生米(二)时行得通,但是在做这道题时出了问题,不知道如何解决,请教高人给出算法指点一下

[解决办法]
少年,你是哪位?Are you from NWPU?
And who is your teacher?Qwang or someone else?
我现在也在纠结这个问题——花生米(三)

[解决办法]

C/C++ code
#include<iostream>using namespace std;bool dp[1001][1001];//dp[i][j]表示还剩i粒花生米,并且当前可以取j粒的时候,要使对方取走最后一粒,是否应该先取int main(){    int n;    cin>>n;    for(int i=2;i<=n;++i)    {        for(int j=1;j<i-1;++j)        {            bool flag=false;            for(int k=1;k<=j&&k<=i;++k)                if(!dp[i-k][2*k])                {                    flag=true;                    break;                }            dp[i][j]=flag;        }        for(int j=i-1;j<=n;++j)            dp[i][j]=true;    }    cout<<dp[n][1]<<endl;    system("pause");} 

热点排行