Ural的鹰蛋实验
题目描述
在ural大学的一个教授的别墅上有一鹰巢。教授对这个鹰巢很感兴趣。经过仔细观察,他发现鹰巢中有若干枚蛋。于是他想利用这些蛋做一个试验。测试一下蛋的坚固程度。
这些蛋应该是具有相同的坚硬度。存在一个非负整数E,如果从楼的第E层往下扔蛋,但不会破,但如果从第E+1层(包括高于E+1层)扔,蛋就会破。你要做一组试验,来找出E。最简单的方法是一层层试。但是你有多个蛋是,不必用笨方法,可以用更少的次数找出E。注意这里的次数都是指对你的方法的最坏情况且蛋破了就不能再用,还有E可以取0。
如果实验到了最高层蛋还不破,则认为E取最高层的层数。
输入格式
一行,蛋的个数n和楼的层数n,k<=1000。(中间一个空格)
输出格式
最少实验次数。
非常神奇的动态规划题,趣味无穷。
1 #include<iostream> 2 using namespace std; 3 4 int n,m,f[11][1001]; 5 6 int min(int a,int b){ 7 if(a>b) return b;return a; 8 } 9 int max(int a,int b){ 10 if(a>b) return a;return b; 11 } 12 13 int main() 14 { 15 16 cin>>n>>m; 17 n=min(n,10); 18 19 for(int i=1;i<=m;++i) 20 f[1][i]=i; 21 22 for(int i=2;i<=n;++i) 23 for(int j=1;j<=m;++j) 24 for(int k=1;k<=j;++k) 25 if(f[i][j]==0) f[i][j]=1+max(f[i-1][k-1],f[i][j-k]); 26 else f[i][j]=min(f[i][j],1+max(f[i-1][k-1],f[i][j-k])); 27 28 cout<<f[n][m]<<endl; 29 // system("pause"); 30 31 return 0; 32 33 }