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-ボールの個数しか取れず、適当に枝を切ることに注意します.
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