|
> No.3750[元記事へ]
部分集合の生成
集合A={a1,a2,a3,…,an}のとき
部分集合は、φ,{a1},{a2},…,{an},{a1,a2},…,{a1,an},…,{a1,a2,…,an}、個数は2^n個
その1
LET N=4 !A={1,2,3,4}
DIM B(N)
CALL subset(1,1,N,B)
END
EXTERNAL SUB subset(X,K, N,S()) !バックトラック法
IF X>N THEN
PRINT "{";
FOR i=1 TO K-1
PRINT S(i);
NEXT i
PRINT "}"
ELSE
LET S(K)=X
CALL subset(X+1,K+1,N,S)
CALL subset(X+1,K,N,S)
END IF
END SUB
その2 Σ[r=0,n]C(n,r)=C(n,0)+C(n,1)+C(n,2)+ … +C(n,n)=2^n
LET N=4 !A={1,2,3,4}
FOR R=0 TO N !r個の要素
FOR K=0 TO COMB(N,R)-1
PRINT Num2CombBit(K,N,R)
NEXT K
PRINT
NEXT R
END
EXTERNAL FUNCTION Num2CombBit(h,N,R) !番号から組合せビットパターンを生成する ※辞書式順序
LET v=h+1
LET j=R
LET A=0
FOR i=N-1 TO 0 STEP -1 !組合せをビット位置とする
LET t=COMB(i,j)
IF v>t THEN
LET A=A+2^i !ビット位置(N-i-1)を1とする
LET j=j-1
LET v=v-t
END IF
NEXT i
LET Num2CombBit=A
END FUNCTION
集合A={1,2,4}のとき
部分集合は、φ,{1},{2},{4},{1,2},{1,4},{2,4},{1,2,4}
LET A=BVAL("1101",2) !A={1,2,4}
LET Y=A
DO
LET S=BITAND(A,Y) !a & (a-1)
PRINT S
LET Y=S-1
LOOP WHILE S>0
END
|
|