質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

2回答

188閲覧

計算方法 python

yuudai

総合スコア65

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2018/10/31 10:34

1から43までの数字から6個の数字を選んでその和が52以下になる組み合わせが何通りあるかを計算したいのですがどうすれば良いですか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mather

2018/10/31 10:46

丸投げの質問では回答できません。まずはあなたが書いてみたPythonコードやどうやったら解決できるか考えた部分を断片的でもいいので教えてください。
tiitoi

2018/10/31 14:02

DP の部分和問題で解けそうな気がします。
guest

回答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
katoy

総合スコア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
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuudai

2018/10/31 14:24

自分ではどうにもなりませんでした。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問