SXF 209集合遍歴
7028 ワード
K色の小球(K<=10)があり、各小球は数個あり、総数は100個未満である.今は小さな箱があって、N個の小さなボール(N<=8)を入れることができて、今これらの小さなボールの中からN個の小さなボールを選んで、箱をいっぱい入れます.どんな選び方があるか知りたいです.注意:各色のボールの間に差はありません.
ボールを選ぶすべての方法を数字の増分順に出力してください.
3色ある場合、各色の小球の個数はそれぞれa:1,b:2,c:3であり、3つの小球を選び出す選び方は:003012021102111120
入力説明:第1行の2つの数字KNは、それぞれ小球の種類の数と選択した小球の数を表し、第2行は各小球の数で始まり、K行のデータである.
出力説明:すべての実行可能な選択スキームを出力し、昇順に並べ替えます.
入力例1:3 3 1 2 3
出力例1:003 012 021 102 111 120
深く探して操作して、すべてと定値の情況を求めます.ただ、和数ごとに一定の制限があります.0-ボールの個数しか取れず、適当に枝を切ることに注意します.
ボールを選ぶすべての方法を数字の増分順に出力してください.
3色ある場合、各色の小球の個数はそれぞれa:1,b:2,c:3であり、3つの小球を選び出す選び方は:003012021102111120
入力説明:第1行の2つの数字KNは、それぞれ小球の種類の数と選択した小球の数を表し、第2行は各小球の数で始まり、K行のデータである.
出力説明:すべての実行可能な選択スキームを出力し、昇順に並べ替えます.
入力例1:3 3 1 2 3
出力例1:003 012 021 102 111 120
深く探して操作して、すべてと定値の情況を求めます.ただ、和数ごとに一定の制限があります.0-ボールの個数しか取れず、適当に枝を切ることに注意します.
while True:
try:
K, N = list(map(int, input().split()))
ball_count = []
for i in range(K):
ball_count.append(int(input()))
result = []
def DFS(cur_sum, K, index, ball_count, path, result):
if cur_sum == K:
path = path + [0] * (len(ball_count) - index)
result.append(path)
return
if cur_sum > K or index >= len(ball_count):
return
for i in range(ball_count[index] + 1):
DFS(cur_sum + i, K, index + 1, ball_count, path[:] + [i], result)
DFS(0, N, 0, ball_count, [], result)
for i in range(len(result)):
result[i] = list(map(str, result[i]))
print("".join(result[i]))
except:
break