劍指offer43 n個骰子的點數

2021-09-10 17:13:32 字數 1579 閱讀 6470

類似青蛙跳台階的問題

第n個骰子點數為1的話,f(n,s)=f(n-1,s-1),當第n個骰子點數為2的話,f(n,s)=f(n-1,s-2),…,

依次類推。在n-1個骰子的基礎上,再增加乙個骰子出現點數和為s的結果只有這6種情況!

f(n,s)=f(n-1,s-1) 這個等式只是在 第n個點數為1的時候,所有考慮的全部的情況,那就是 6種情況全部考慮進去

static

intgetnumcount

(int n,

int sum)

// 1個骰子的話,所有的情況只有1種可能

if(n ==1)

// 類似青蛙跳台階的問題

// 第n個骰子點數為1的話,f(n,s)=f(n-1,s-1),當第n個骰子點數為2的話,f(n,s)=f(n-1,s-2),…,

// 依次類推。在n-1個骰子的基礎上,再增加乙個骰子出現點數和為s的結果只有這6種情況!

// f(n,s)=f(n-1,s-1) 這個等式只是在 第n個點數為1的時候,所有考慮的全部的情況,那就是 6種情況全部考慮進去

return

getnumcount

(n -

1, sum -1)

+getnumcount

(n -

1, sum -2)

+getnumcount

(n -

1, sum -3)

+getnumcount

(n -

1, sum -4)

+getnumcount

(n -

1, sum -5)

+getnumcount

(n -

1, sum -6)

;}public

static

void

main

(string[

] args)

}

遞迴的方法就會發生 某乙個n和sum的組合被多次的計算,所以我們需要對他進行剪枝。

剪枝的方法一般是通過空間來換取時間,所以我們使用額外空間來儲存計算過的結果。

使用二維陣列,空間複雜度還是有點高。

static

int[

]getnumcount1

(int n)

}return count;

}

一維陣列

/****************************************

func:給定骰子數目n,求所有可能點數和的種類數

para:n:骰子個數;count:存放各種點數和的種類數,下標i表示點數和為(i+n)

****************************************/

static

int[

]getnumcount2

(int n)

}return count;

}

劍指offer 43 n個骰子的點數

n個骰子的點數 把n個骰子扔在地上,點數之和為s,輸入個數n,列印出所有可能的值出現的概率 解法1 兩個矩陣迭代相加,乙個點數等於之前6個點數相加 public class main public static void printpro int n int matrix new int 2 6 n...

n個骰子 劍指offer

暴力求解,n個骰子和為s就等於n 1個骰子和分別為s 1 s 6時次數的總和。據此寫出 如下 int baoli int n,int s int count 0 count baoli n 1,s 1 baoli n 1,s 2 baoli n 1,s 3 baoli n 1,s 4 baoli n...

劍指offer 面試題43 n個骰子的點數

題目 把n個骰子扔在地上,所有骰子朝上一面的點數之和為s。輸入n,列印出s的所有可能的值出現的概率。解法一 遞迴 玩過麻將的都知道,骰子一共6個面,每個面上都有乙個點數,對應的數字是1到6之間的乙個數字。所以,n個骰子的點數和的最小值為n,最大值為6n。因此,乙個直觀的思路就是定義乙個長度為6n n...