动态规划 花生米问题
描述:
五一长假第三天,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?
我现在也在纠结这个问题——花生米(三)
[解决办法]
#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");}