神奇的口袋:有乙個神奇的口袋,總的容積是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演算法:
1defmain():
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就可以得到這些物品。現在的...