Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonのターゲット合計を持つダイスロールの数


d個のサイコロがあり、各サイコロに1、2、...、fの番号が付けられたf個の面があるとします。サイコロを振るには、10 ^ 9 + 7を法として(fdの合計ウェイのうち)可能なウェイの数を見つけて、表向きの数字の合計がターゲットと等しくなるようにする必要があります。したがって、入力がd =2、f =6、target =7の場合、出力は6になります。したがって、6つの面を持つ各サイコロを投げる場合、合計6を1+6として取得する6つの方法があります。 2 + 5、3 + 3、4 + 3、5 + 2、6+1。

これを解決するには、次の手順に従います-

  • m:=1e9 + 7
  • 次数dx(t + 1)のテーブルdpを作成し、これに0を入力します
  • 0からd–1の範囲のiの場合
    • 0からtの範囲のjの場合
      • i =0の場合、jが1からfの範囲にある場合はdp [i、j]:=1、それ以外の場合は0
      • それ以外の場合
        • 1からfの範囲のlの場合
          • j – l> 0の場合、dp [i、j]:=dp [i、j] + dp [i – 1、j --l]、およびdp [i、j]:=dp [i、 j] mod m
  • return dp [d – 1、t] mod m
例(Python)

理解を深めるために、次の実装を見てみましょう-

class Solution(object):
   def numRollsToTarget(self, d, f, t):
      mod = 1000000000+7
      dp =[[0 for i in range(t+1)] for j in range(d)]
      for i in range(d):
         for j in range(t+1):
            if i == 0:
               dp[i][j] = 1 if j>=1 and j<=f else 0
            else:
               for l in range(1,f+1):
                  if j-l>0:
                     dp[i][j]+=dp[i-1][j-l]
                     dp[i][j]%=mod
      return dp [d-1][t] % mod
ob = Solution()
print(ob.numRollsToTarget(2,6,7))

入力

2
6
7

出力

6

  1. Pythonで合計がkであるパスの数をカウントするプログラム

    二分木と別の値kがあるとすると、合計がkになるサブ子パスへの一意のノードの数を見つける必要があります。 したがって、入力が次のような場合 k =5の場合、パスは[2、3]と[1、4] であるため、出力は2になります。 これを解決するには、次の手順に従います- count:=マップは最初にキー0の値1を保持します ans:=0、プレフィックス:=0 関数dfs()を定義します。これはノードを取ります ノードがnullでない場合、 プレフィックス:=プレフィックス+ノードの値 ans:=ans +(count [prefix --target]、これが利用できない場合は0にな

  2. Pythonプログラムで数の偶数因子の合計を見つける

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −数値が与えられているので、数値のすべての偶数因子の合計を表示する必要があります。 アプローチ 数値が奇数かどうかを確認し、偶数の因子がないため、0を返します。 数が偶数の場合、計算を実行します。 20を除く他のすべての項は、偶数の因数の合計を生成するために乗算されます。 偶数因子のすべての奇数を削除するために、1である20を無視します。このステップの後、偶数因子のみを取得しました。 2は私たちが利用できる唯一の素数であることに注意してください。 次に、以下の実装を見てみましょう- 例 # math