题意:
给n个气球,通过多少次实验可以确定气球的硬度
思路:
用状态dp[i][j]表示用i个气球j次实验所到达的高度,我们考虑第一次,假设所测试的楼层是k层,若气球破了,则我们知道dp[i-1][j-1]的高度为k-1层,则k=dp[i-1][j-1]+1 ,若气球没破,即进行了一次实验,在原来所测的基础中又增加了dp[i][j-1]
代码如下:
#include <iostream>
#include <stdio.h>
#include <string.h>using namespace std;
typedef long long ll;
const int INF=63;
ll dp[64][64];
void init()
{memset(dp,0,sizeof(dp));for(int i=1;i<=63;i++)for(int j=1;j<=63;j++)dp[i][j]=dp[i][j-1]+dp[i-1][j-1]+1;
}
int main()
{init();int k,minn;ll n;while(~scanf("%d%lld",&k,&n)&&k&&n){minn=INF;int flag=0;minn=min(minn,k);int i;for(i=1;i<=63&&!flag;i++)if(dp[minn][i]>=n)flag=1;if(flag)printf("%d\n",i-1);elseprintf("More than 63 trials needed.\n");}return 0;
}