给K个鸡蛋,共N层,确定最少扔的次数
public static void main(String[] args) {
int k = 2;//为鸡蛋数
int n = 100;//楼层
int[][] nums = new int[k + 1][n + 1];
System.out.println(dp(k, n, nums));
int[][] nums2 = new int[k + 1][n + 1];
System.out.println(dp2(k, n, nums2));
}
/**
* @param k 为鸡蛋
* @param n 楼层
* @return
*/
public static int dp(int k, int n, int[][] nums) {
if (k == 1) return n;
if (n == 0) return 0;
if (nums[k][n] > 0) return nums[k][n];
int res = Integer.MAX_VALUE;
for (int i = 1; i <= n; i++) {
res = Math.min(res, Math.max(dp(k, n - i, nums), dp(k - 1, i - 1, nums)) + 1);
nums[k][n] = res;
}
return nums[k][n];
}
/**
* 二分查找
*
* @param k
* @param n
* @param nums
* @return
*/
public static int dp2(int k, int n, int[][] nums) {
if (k == 1) return n;
if (n == 0) return 0;
if (nums[k][n] > 0) return nums[k][n];
int res = Integer.MAX_VALUE;
int low = 1;
int high = n;
while (low <= high) {
int mid = (low + high) / 2;
int broken = dp2(k - 1, mid - 1, nums);
int no_broken = dp2(k, n - mid, nums);
if (broken > no_broken) {
high = mid - 1;
res = Math.min(res, broken + 1);
} else {
low = mid + 1;
res = Math.min(res, no_broken + 1);
}
nums[k][n] = res;
}
return nums[k][n];
}
}