鸡蛋楼层问题

题目

鸡蛋楼层问题_第1张图片

考点分析(个人观点)

首先,我没学动态规划,我不清楚自己分析的是否正确。如有错误,请多多见谅。

  1. 先从一个鸡蛋的情况开始分析,你能操作n步,你就能测试出有n层。然后从多个鸡蛋,只能测一步,那也只能测出一层了。再看两个鸡蛋的情况,假如你第一个鸡蛋从第n层开始甩,若鸡蛋碎了,你就只剩下一个鸡蛋来测试n层以下的楼层。所以,2个鸡蛋可以分解成许多一个鸡蛋的子问题。(要得出最少步,则这些在后面的子问题总要比前面的子问题少一次操作,因为中间摔坏第一个鸡蛋的时候,第二次比第一次少一次操作)
  2. 要用最少步的结果,可以转换为在有n个鸡蛋的条件下,至少操作多少部才能达到计算的总楼层数比输入楼层数高。
  3. 可以用一个二维数组来储存最高楼层数,这样循环输入的时候可以避免重复计算,又因为楼层<1000,故计算到比1000大的时候就可以换行处理。

代码

#include 
using namespace std;
int step[1000][1000];
int main()
{
    int group_num, egg, high;
    for(int tmp = 0; tmp < 1000; tmp++)//如果你只有一个鸡蛋,那么n层肯定要n步
        step[0][tmp] = tmp+1;
    for(int tmp = 1; tmp < 1000; tmp++)//这里的tmp是(鸡蛋个数-1),
    {
        step[tmp][0] = 1;//当操作数为1时,只能测出一层楼
        for(int tmp2 = 1; tmp2 < 1000; tmp2++)
        {
            if(step[tmp][tmp2-1] + step[tmp-1][tmp2-1] + 1 < 1000)//因为楼层只有1000层,所以大于1000的数据完全可以不用看
                step[tmp][tmp2] = step[tmp][tmp2-1] + step[tmp-1][tmp2-1] + 1;
            //(注意tmp与tmp2都是下标值,都比实际操作值小1)
            //如果第一次鸡蛋碎了,往下就是一个 tmp2个鸡蛋操作tmp次 的问题,
            //如果第一个鸡蛋没碎,往上就是一个 tmp2+1个鸡蛋操作tmp次 的问题
            //中间的 +1 是加上抛下去的楼层
            else
            {
                step[tmp][tmp2] = step[tmp][tmp2-1] + step[tmp-1][tmp2-1] + 1;
                tmp2 = 1001;//大于1000就储存一个作为标志然后就弹出循环
            }
        }
    }
    cin >> group_num;
    while(group_num--)
    {
        cin >> egg;
        cin >> high;
        for(int tmp = 0; tmp < 1000;tmp++)
        {
            if(step[egg-1][tmp] >= high)
            {
                cout << tmp+1 <

个人感觉

这怎么和分治法有点像啊,这动态规划到底是啥啊(ノ=Д=)ノ┻━┻(

你可能感兴趣的:(C++,C++,分治法)