Pythonアルゴリズム128回|[標準15650回]N+M(2)

4683 ワード

128. N+M(2)
質問する
自然数NとMが与えられた場合、以下の条件を満たすすべての長さMの数列を解くプログラムを作成します.
1からNまで自然数の中でM個の数列を繰り返し選択しない
選択した数の列は昇順に並べます.
入力
第1行は自然数NとMを与える.(1 ≤ M ≤ N ≤ 8)
しゅつりょく
各行に問題条件を満たす数列を出力します.重複する数列は複数回出力できません.各数列はスペースで区切らなければなりません.
数列は予め増加した順序で出力しなければならない.
入力例1
3 1
サンプル出力1
1
2
3
入力例2
4 2
サンプル出力2
1 2
1 3
1 4
2 3
2 4
3 4
入力例3
4 4
サンプル出力3
1 2 3 4
1)どのような戦略(アルゴリズム)で解決しますか.
2)符号化説明
『私の答え』

def nm(N,M):
    if N==m :
        for i in item:
            print(i, end=" ")
        print()
    else :
        for i in range(M,n+1):
            if chk[i] == 0 :
                item.append(i)
                chk[i]=1
                nm(N+1,i+1)
                chk[i]=0
                item.pop()

if __name__=="__main__":
    n,m=map(int,input().split())
    chk=[0]*(n+1) #체크용, 사용 여부
    item=[]
    nm(0,1)#n은 뽑을 갯수, m은 이미 뽑은 건 지나치기
<他人の解答or私の誤答、問題点>
ソース:ソース


『反省点』
『学んだこと』