動態規劃 神奇的口袋V2

2022-03-24 07:44:33 字數 2361 閱讀 1998

神奇的口袋:有乙個神奇的口袋,總的容積是40,用這個口袋可以變出

一些物品,這些物品的總體積必須是40。

 john現在有n(1≤n ≤ 20)個想要得到的物品,每個物品

的體積分別是a1,a2 ……an 。john可以從這些物品中選擇一

些,如果選出的物體的總體積是40,那麼利用這個神奇的

口袋,john就可以得到這些物品。現在的問題是,john有

多少種不同的選擇物品的方式。

輸入:輸入的第一行是正整數n (1 <= n <= 20),表示不同的物品的

數目。接下來的n行,每行有乙個1到40之間的正整數,分別

給出a1,a2 ……an 的值。

輸入樣例 輸出樣例

3 3

2020

20動態規劃實現:遞迴實現當資料量過大,執行時間過長,dp的方式實現,

執行速度相對較快。i--剩餘體積數 j--表示所選擇的物品

dp[i][j] = dp[i][j-1] + dp[i-nums[j]][j-1]

比如求dp[1][1],dp[20][1],dp[30][3],dp[20][2],dp[10][1]等等,

其實最終都是為了實現求dp[40][1],dp[40][2],dp[40][3],

因為求它們的值需要前面的值,這就是dp[40][3]就是求,從3個物品中,

找出能湊夠40有幾種方法,那麼

dp[40][3] = dp[40][2]+dp[40-nums[3]][2]

dp[40][2] = 1,dp[40-nums[3]][2] = 2

所以dp[40][3]=3

輸入樣例 輸出樣例

3 3

2020

20dp二維陣列的值如下:

[[1, 1, 1, 1],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 1, 2, 3],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],[0, 0, 0, 0],

[0, 0, 1, 3]]

python演算法:

1

defmain():

2 n =int(input())3#

dp[i][j]表示從前j種物品裡湊出體積i的方法數

4 dp = [[0] * (n+1) for i in range(41)]5#

表示體積數剛巧用完,物品也剛好用完,算1種方法

6 dp[0][0] = 1

7 nums =

8for j in range(1,n+1):910

#0表示剛好用完體積數40,所以無論j的值多少,都算1種方法

11 dp[0][j] = 112#

為了從序號1開始計算方便,在list0位置增加乙個0無意義的數字

13nums.insert(0,0)

14for i in range(1,41):

15for j in range(1,n+1):16#

表示沒有選擇該物品

17 dp[i][j] = dp[i][j-1]18#

如果剩餘的體積數》=所選擇物品的體積數,才能選擇

19if i-nums[j] >=0:

20 dp[i][j] += dp[i-nums[j]][j-1]

2122

print("

有%d種不同的選擇物品的方式!

"%dp[-1][-1])

2324

25if

__name__ == '

__main__':

26 main()

神奇的口袋(動態規劃)

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a 1,a 2 a n。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,j...

神奇的口袋(動態規劃)

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n個想要得到的物品,每個物品的體積分別是a 1,a 2 a n。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的問題是,j...

動態規劃之神奇的口袋

有乙個神奇的口袋,總的容積是40,用這個口袋可以變出一些物品,這些物品的總體積必須是40。john現在有n 1 n 20 個想要得到的物品,每個物品的體積分別是a1,a2 an。john可以從這些物品中選擇一些,如果選出的物體的總體積是40,那麼利用這個神奇的口袋,john就可以得到這些物品。現在的...