題目:
放水果
把M個相同的水果放在N個同樣的盤子里,允許有的盤子空著不放,問不同的放法數K是多少?請注意,5,1,1和1,5,1 是同一種放法。輸入描述
第一行是測試數據的數目t(0 <= t <= 20),隨后的每行均包含二個整數M和N,以空格分開。1<=M,N<=10。輸出描述
對輸入的每組數據M和N,在單獨的行里輸出相應的K。樣例輸入
5
2 5
3 3
9 5
2 10
5 1
樣例輸出
2
3
23
2
1
面試官給了提示:
dp[i][j]表示將i個水果放入j個盤子的放法數。我們首先初始化所有dp[i][0]為1,因為將任何數量的水果放入0個盤子只有一種方法,即不放。然后,我們逐行填充動態規劃表,對于每個dp[i][j],如果j大于i,則dp[i][j]等于dp[i][i],因為多余的盤子無法放入水果;否則,dp[i][j]等于dp[i][j-1](不使用第j個盤子的放法數)加上dp[i-j][j](使用第j個盤子的放法數)。最后,dp[n][m]就是我們要求的結果。需要考慮兩種情況:一種是不使用第j個盤子,另一種是使用第j個盤子。dp[i][j-1]表示的是第一種情況的放法數,dp[i-j][j]表示的是第二種情況的放法數。將這兩種情況的放法數相加,就得到了總的放法數。
當時是沒看懂的,主要也不太懂為啥dp[i-j][j]表示的是第二種情況的放法數
按照提示寫了代碼,但是運行結果也不對
package mainimport "fmt"
import "io"// To execute Go code, please declare a func main() in a package "main"// The TestCase is shown below
// Input : 1 2
// Output : 3func main() {var t int_,err := fmt.Scanf("%d", &t)if err != nil {fmt.Println("err")return}for i := 0; i < t; i ++ {var M ,N int_,err := fmt.Scanf("%d %d", &M, &N)if err == io.EOF {break}else{// fmt.Println(M, N)fmt.Println(test(M, N))// fmt.Println("Your result is : ", a + b)}}
}func test(M, N int) int {dp := make([][]int, M+1)for i := 0; i <= M; i ++ {dp[i] = make([]int, N+1)dp[i][0] = 1}for i := 0; i <= M; i ++ {for j := 1; j <= N; j ++ {if j > i {dp[i][j] = dp[i][i]} else {dp[i][j] = dp[i-j][j] + dp[i][j-1]}}}return dp[M][N]
}
有大佬路過可以給點幫助