Guest User

Untitled

a guest
Nov 25th, 2023
482
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.22 KB | Source Code | 0 0
  1. def count_partitions_odd_restricted(N, n):
  2.     # 初始化一個二維動態規劃表格,第一維表示總和,第二維表示當前位置(0為偶數,1為奇數)
  3.     dp = [[0 for _ in range(2)] for _ in range(N + 1)]
  4.  
  5.     # 基礎情況:總和為0的方法數為1
  6.     dp[0][0] = 1
  7.  
  8.     # 遍歷所有可能的總和
  9.     for j in range(1, N + 1):
  10.         # 分別處理奇數和偶數位置
  11.         for is_odd in range(2):
  12.             # 處理偶數位置(無限制)
  13.             if is_odd == 0:
  14.                 for i in range(1, j + 1):
  15.                     dp[j][is_odd] += dp[j - i][1]
  16.             # 處理奇數位置(限制加數不超過n)
  17.             else:
  18.                 for i in range(1, min(j, n-1) + 1):
  19.                     dp[j][is_odd] += dp[j - i][0]
  20.  
  21.     # 最終結果是偶數位置和奇數位置的總和
  22.     return dp[N][0] + dp[N][1]
  23.  
  24. def count_partitions_even_restricted(N, n):
  25.     # 初始化一個二維動態規劃表格,第一維表示總和,第二維表示當前位置(0為偶數,1為奇數)
  26.     dp = [[0 for _ in range(2)] for _ in range(N + 1)]
  27.  
  28.     # 基礎情況:總和為0的方法數為1
  29.     dp[0][0] = 1
  30.  
  31.     # 遍歷所有可能的總和
  32.     for j in range(1, N + 1):
  33.         # 分別處理奇數和偶數位置
  34.         for is_odd in range(2):
  35.             # 處理奇數位置(無限制)
  36.             if is_odd == 1:
  37.                 for i in range(1, j + 1):
  38.                     dp[j][is_odd] += dp[j - i][0]
  39.             # 處理偶數位置(限制加數不超過n)
  40.             else:
  41.                 for i in range(1, min(j, n-1) + 1):
  42.                     dp[j][is_odd] += dp[j - i][1]
  43.  
  44.     # 最終結果是偶數位置和奇數位置的總和
  45.     return dp[N][0] + dp[N][1]
  46.  
  47. def prob(N, n):
  48.     ans1 = count_partitions_odd_restricted(N,n)
  49.     ans2 = count_partitions_even_restricted(N,n)
  50.     print (f'存活可能數 {ans1} + {ans2} = {ans1+ans2}')
  51.     print (f'失敗可能數 {2 ** N} - {ans1+ans2} = {2 ** N - ans1 - ans2}')
  52.     print (f'失敗率 {2 ** N - ans1 - ans2} / {2 ** N} = {(2 ** N - ans1 - ans2) / (2 ** N)}')
  53.     return
  54.  
  55.  
  56. input_str = input("請輸入N與n(用空格分隔): ")
  57. N, n = map(int, input_str.split())
  58. prob(N,n)
  59.  
Advertisement
Add Comment
Please, Sign In to add comment