| ||||||||||||||||||||||||
#include <stdio.h> #include <stdlib.h> int max(int x, int y) { return (x > y) ? x : y; } int f(int n, int m) /* n层楼m个鸡蛋所需的次数 */ { if (m == 1) return n; /* 1个鸡蛋只能从一楼开始一层一层试,最多需要n次 */ else if (n <= 1) return n; /* 1层楼最多只要扔一次 */ else { static int answer[101][11]; /* 用于存储已经计算的结果 */ if (answer[n][m]) /* 如果之前已经计算并存储,则直接读取,无需再次计算 */ { return answer[n][m]; } else { int times = 9999; int j; for (j = 1; j <= n; j++) /* 考虑所有策略,选取最优解 */ { int x = f(j - 1, m); /* 如果没有碎,接着用这m个鸡蛋测试下面的(j-1)层 */ int y = f(n - j, m - 1); /* 如果蛋碎了,接着用剩下的(m-1)个鸡蛋测试上面的(n-j)层 */ int z = 1 + max(x, y); /* 要考虑最坏情况 */ if (z < times) /* 发现更优的策略 */ times = z; } return answer[n][m] = times; /* 存储计算结果,以备下次直接读取 */ } } } int main() { int n = 100, m = 2; while (scanf("%d%d", &n, &m) == 2) { printf("%d\n", f(n, m)); } return 0; } |
习题(15-12) 鸡蛋的硬度
最新推荐文章于 2024-02-26 14:29:25 发布