雙蛋問題:
public class Egg {
public static void main(String[] args) {
int[][] a = new int[1][2];
System.out.println(a.length);//1
new Egg().dp(100);
}
//t層樓,2個蛋
public void dp(int t) {
//t層樓,n個雞蛋最多需要多少次
int[][] a = new int[t + 1][3];
//樓層數量一直在變化,只有1個雞蛋時候的扔法
for (int i = 1; i < a.length; i++) {
a[i][1] = i;
}
//只有1層樓,雞蛋數量一直在變化時候的扔法
for (int i = 1; i < a[0].length; i++) {
a[1][i] = 1;
}
//從只有2層樓的情況開始
for (int i = 2; i <= t; i++) {
int result = Integer.MAX_VALUE;
//從第一層開始扔,一直有t中扔法
for (int j = 1; j < i; j++) {
//雞蛋碎了,還有j-1層樓(從第一層到第j層),1個雞蛋
int timesA = a[j - 1][1] + 1;
//雞蛋沒碎,還有i-j層樓,2個雞蛋
int timesB = a[i - j][2] + 1;
//樓層最不容易驗出來的情況下所需要扔的最大次數
int bad = Math.max(timesA, timesB);
//記錄選取最好的扔法
result = Math.min(bad, result);
}
a[i][2] = result;
}
}
}
n蛋問題:
/**
* N個蛋,T層樓高
* 第一個蛋扔在第K層的時候
* 1個蛋1層樓
*/
public class Egg {
//t層樓,n個蛋
public void dp(int t, int n) {
//t層樓,n個雞蛋最多需要多少次
int[][] a = new int[t + 1][n + 1];
//1層樓,蛋的數量在變化
for (int i = 1; i <= n; i++) {
a[1][i] = 1;
}
//1個蛋,樓層在變化
for (int j = 1; j <= t; j++) {
a[j][1] = j;
}
//樓層在升高
for (int t1 = 2; t1 < t + 1; t1++) {
//蛋的數量在增加
for (int n1 = 2; n1 < n + 1; n1++) {
int min = Integer.MAX_VALUE;
//從第1層開始扔
for (int f = 1; f < t1; f++) {
//如果雞蛋沒碎,求解方程就是t1-f樓,n1個蛋的情況
int timesA = a[t1 - f][n1];
//如果雞蛋碎了,證明還有f-1層樓,n1-1個蛋的情況
int timesB = a[f - 1][n1 - 1];
//先取最壞情況需要探測的次數,在找到最好的樓層扔法
int bad = Math.max(timesA, timesB) + 1;
//計算最壞情況的最好解法
min = Math.min(min,bad);
}
//按樓層不變,蛋數遞增的情況一步步填充。
a[t1][n1] = min;
}
}
for (int i = 1; i < a.length; i++) {
for (int j = 1; j < a[i].length; j++) {
System.out.println(i+"層樓"+j+"個蛋的最好扔法需扔:"+a[i][j]+"次");
}
}
}
public static void main(String[] args){
new Egg().dp(100,2);
}
}