1から43までの数字から6個の数字を選んでその和が52以下になる組み合わせが何通りあるかを計算したいのですがどうすれば良いですか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
丸投げの質問では回答できません。まずはあなたが書いてみたPythonコードやどうやったら解決できるか考えた部分を断片的でもいいので教えてください。
2018/10/31 14:02
DP の部分和問題で解けそうな気がします。
回答2件
0
6 重の loop を書いて解いてみました。
x2.py
python3
1ans = 0 2for a in range(1, 44): 3 for b in range(a + 1, 44): 4 for c in range(b + 1, 44): 5 for d in range(c + 1, 44): 6 for e in range(d + 1, 44): 7 for f in range(e + 1, 44): 8 if a + b + c + d + e + f <= 52: 9 ans += 1 10print(ans)
a + c + 。。。+ f は無駄に何回同じ計算をしているし、途中の小計が 52 以上になったらループは脱出してよいことを組み込んで見ました。
x3.py
python3
1ans = 0 2for a in range(1, 44): 3 s_a = a 4 for b in range(a + 1, 44): 5 s_b = s_a + b 6 if s_b >= 52: 7 break 8 for c in range(b + 1, 44): 9 s_c = s_b + c 10 if s_c >= 52: 11 break 12 for d in range(c + 1, 44): 13 s_d = s_c + d 14 if s_d >= 52: 15 break 16 for e in range(d + 1, 44): 17 s_e = s_d + e 18 if s_e >= 52: 19 break 20 for f in range(e + 1, 44): 21 s_f = s_e + f 22 if s_f <= 52: 23 ans += 1 24print(ans) 25``` 26 27時間計測も兼ねて次の shell script で実行してみました。 28(x1.py は raccy さんの回答のコード) 29x.sh 30```sh 31#!/bin/bash 32 33echo "------- x1 ---------" 34for i in {1..5} ; do 35 time python3 x1.py 36done 37 38echo "------- x2 ---------" 39for i in {1..5} ; do 40 time python3 x2.py 41done 42 43echo "------- x3 ---------" 44for i in {1..5} ; do 45 time python3 x3.py 46done 47``` 48 49実行例 50``` 51[katoy@katoy-MacBook-Pro-2 ttt]$ ./x.sh 52------- x1 --------- 539907 54 55real 0m3.013s 56user 0m2.144s 57sys 0m0.101s 589907 59 60real 0m2.298s 61user 0m2.126s 62sys 0m0.081s 639907 64 65real 0m2.360s 66user 0m2.174s 67sys 0m0.086s 689907 69 70real 0m2.376s 71user 0m2.079s 72sys 0m0.081s 739907 74 75real 0m2.337s 76user 0m2.182s 77sys 0m0.075s 78------- x2 --------- 799907 80 81real 0m2.857s 82user 0m2.661s 83sys 0m0.082s 849907 85 86real 0m2.769s 87user 0m2.594s 88sys 0m0.084s 899907 90 91real 0m2.823s 92user 0m2.632s 93sys 0m0.087s 949907 95 96real 0m3.834s 97user 0m2.655s 98sys 0m0.092s 999907 100 101real 0m3.026s 102user 0m2.823s 103sys 0m0.087s 104------- x3 --------- 1059907 106 107real 0m0.362s 108user 0m0.165s 109sys 0m0.068s 1109907 111 112real 0m0.306s 113user 0m0.164s 114sys 0m0.067s 1159907 116 117real 0m0.293s 118user 0m0.154s 119sys 0m0.067s 1209907 121 122real 0m0.294s 123user 0m0.155s 124sys 0m0.066s 1259907 126 127real 0m0.327s 128user 0m0.166s 129sys 0m0.078s 130``` 131 132参考情報 133- Pythonで順列・組み合わせを求める 134[https://qiita.com/BlueSilverCat/items/77f4e11d3930d7b8959b](https://qiita.com/BlueSilverCat/items/77f4e11d3930d7b8959b)
投稿2018/10/31 13:41
編集2018/10/31 13:43総合スコア22324
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
ベストアンサー
愚直なやり方ですが、Rubyだとこう書きます。
Ruby
1(1..43).to_a.combination(6).map(&:sum).select(&52.method(:>=)).size
これをPythonに書き直せば求めるコードになります。
と言いたいところですが、Pythonはmapやfilterは邪道という文化ですので、リスト内包表記を使います。
Python3
1from itertools import combinations 2len([x for x in combinations(range(1, 44), 6) if sum(x) <= 52])
なお、最適化を全くしていないので、これよりも速いアルゴリズムは存在します。
投稿2018/10/31 11:31
編集2018/10/31 11:45総合スコア21735
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。