[Uva10934]Dropping water balloons
题目大意:你有k个一模一样的水球,在一个n层楼的建筑物上进行测试,你想知道水球最低从几层楼往下丢可以让水球破掉。由于你很懒,所以你想要丢最少次水球来测出水球刚好破掉的最低楼层。
解题关键:令$dp[i][j]$表示$i$个气球,丢$j$次最多确定的层数
转移方程:$dp[i][j] = dp[i - 1][j - 1] + 1 + dp[i][j - 1]$
$dp[i][j]$可以由两方面转化而来,
一方面,在$i$个气球,丢了$j-1$次时,第$j$次没破
另一方面,在第$i-1$个气球时,丢了$j-1$次,第$j$次破了,确定层数需要+1
这道题注意的是思路的转化。
#include<bits/stdc++.h> using namespace std; typedef long long ll; ll dp[70][70],k,n; void init(){ 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(); while(~scanf("%lld%lld",&k,&n)&&k){ bool flag=false; k=min((int)k,63); for(int i=0;i<=63;i++){ if(dp[k][i]>=n){ flag=true; printf("%d\n",i); break; } } if(!flag) printf("More than 63 trials needed.\n"); } return 0; }