Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def count_partitions_odd_restricted(N, n):
- # 初始化一個二維動態規劃表格,第一維表示總和,第二維表示當前位置(0為偶數,1為奇數)
- dp = [[0 for _ in range(2)] for _ in range(N + 1)]
- # 基礎情況:總和為0的方法數為1
- dp[0][0] = 1
- # 遍歷所有可能的總和
- for j in range(1, N + 1):
- # 分別處理奇數和偶數位置
- for is_odd in range(2):
- # 處理偶數位置(無限制)
- if is_odd == 0:
- for i in range(1, j + 1):
- dp[j][is_odd] += dp[j - i][1]
- # 處理奇數位置(限制加數不超過n)
- else:
- for i in range(1, min(j, n-1) + 1):
- dp[j][is_odd] += dp[j - i][0]
- # 最終結果是偶數位置和奇數位置的總和
- return dp[N][0] + dp[N][1]
- def count_partitions_even_restricted(N, n):
- # 初始化一個二維動態規劃表格,第一維表示總和,第二維表示當前位置(0為偶數,1為奇數)
- dp = [[0 for _ in range(2)] for _ in range(N + 1)]
- # 基礎情況:總和為0的方法數為1
- dp[0][0] = 1
- # 遍歷所有可能的總和
- for j in range(1, N + 1):
- # 分別處理奇數和偶數位置
- for is_odd in range(2):
- # 處理奇數位置(無限制)
- if is_odd == 1:
- for i in range(1, j + 1):
- dp[j][is_odd] += dp[j - i][0]
- # 處理偶數位置(限制加數不超過n)
- else:
- for i in range(1, min(j, n-1) + 1):
- dp[j][is_odd] += dp[j - i][1]
- # 最終結果是偶數位置和奇數位置的總和
- return dp[N][0] + dp[N][1]
- def prob(N, n):
- ans1 = count_partitions_odd_restricted(N,n)
- ans2 = count_partitions_even_restricted(N,n)
- print (f'存活可能數 {ans1} + {ans2} = {ans1+ans2}')
- print (f'失敗可能數 {2 ** N} - {ans1+ans2} = {2 ** N - ans1 - ans2}')
- print (f'失敗率 {2 ** N - ans1 - ans2} / {2 ** N} = {(2 ** N - ans1 - ans2) / (2 ** N)}')
- return
- input_str = input("請輸入N與n(用空格分隔): ")
- N, n = map(int, input_str.split())
- prob(N,n)
Advertisement
Add Comment
Please, Sign In to add comment