回答編集履歴

1

処理改善

2019/11/23 08:04

投稿

nomuken
nomuken

スコア1627

test CHANGED
@@ -34,59 +34,65 @@
34
34
 
35
35
 
36
36
 
37
- if level == l_len:
38
37
 
38
+
39
+ # 指定された添え字における候補を決定
40
+
41
+ possible = [ True for _ in range(remain + 1) ]
42
+
43
+
44
+
45
+ for k, v in check_dict.items():
46
+
39
- if remain == 0:
47
+ if level in k:
48
+
49
+ c_sum = sum([ temp[_] for _ in k])
50
+
51
+ if v == -1:
52
+
53
+ # lvalueを超える組み合わせを要素
54
+
55
+ for i in range(lvalue - c_sum+1, remain + 1):
56
+
57
+ possible[i] = False
58
+
59
+ elif level == list(k)[-1]:
60
+
61
+ # 合計値指定のfrozensetの最後の場合は候補は一つ(v - c_sum)。それ以外を除外
62
+
63
+ for i in range(0, min(v - c_sum, remain + 1)):
64
+
65
+ possible[i] = False
66
+
67
+ for i in range(v - c_sum+1, remain + 1):
68
+
69
+ possible[i] = False
70
+
71
+ else:
72
+
73
+ # 合計値指定のfrozensetの途中の場合は上限を超える値を除外
74
+
75
+ for i in range(v - c_sum +1, remain + 1):
76
+
77
+ possible[i] = False
78
+
79
+
80
+
81
+ if level == (l_len - 1):
82
+
83
+ # リストの最後の場合は残りのみで判定
84
+
85
+ if possible[remain]:
86
+
87
+ temp[level] = remain
40
88
 
41
89
  result.append(temp.copy())
42
90
 
91
+ temp[level] = 0
92
+
43
93
  else:
44
94
 
45
-
46
-
47
- # 指定された添え字における候補を決定
48
-
49
- possible = [ True for _ in range(remain + 1) ]
50
-
51
-
52
-
53
- for k, v in check_dict.items():
54
-
55
- if level in k:
56
-
57
- c_sum = sum([ temp[_] for _ in k])
58
-
59
- if v == -1:
60
-
61
- # lvalueを超える組み合わせを除外
62
-
63
- for i in range(lvalue - c_sum+1, remain + 1):
64
-
65
- possible[i] = False
66
-
67
- elif level == list(k)[-1]:
68
-
69
- # 合計値指定のfrozensetの最後の場合は候補は一つ(v - c_sum)。それ以外を除外
70
-
71
- for i in range(0, min(v - c_sum, remain + 1)):
72
-
73
- possible[i] = False
74
-
75
- for i in range(v - c_sum+1, remain + 1):
76
-
77
- possible[i] = False
78
-
79
- else:
80
-
81
- # 合計値指定のfrozensetの途中の場合は上限を超える値を除外
82
-
83
- for i in range(v - c_sum +1, remain + 1):
84
-
85
- possible[i] = False
86
-
87
-
88
-
89
- # 候補を使いながら再呼び出し
95
+ # 候補を使いながら再呼び出し
90
96
 
91
97
  for i in range(remain + 1):
92
98