1.インクリメンタル工法の
アイデア:
要素を開始し、プラスの時間要素と出力されません。
注:
書き込み1)注方法:S = CUR A [CUR - 1] + 1:0、 あれば、そうでない使用する必要はありませんか。?構造;
コード:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
void print_subset ( int n , int *A , int cur ) {
for ( int i = 0 ; i < cur ; i ++ ) printf("%d",A[i]) ;
printf("\n") ;
int s = cur ? A[cur - 1] + 1 : 0 ;
for ( int i = s ; i < n ; i ++ ) {
A[cur] = i ;
print_subset ( n , A , cur + 1 ) ;
}
}
int main() {
int n ;
while ( scanf("%d",&n) == 1 ) {
int A[n] ;
print_subset ( n , A , 0 ) ;
}
return 0 ;
}
2.方法ベクトルビット
アイデア:
各番号は、再び選択される0または1のビットベクトル配列の内容として構成され、CURのビットベクトルの数は0から選択されていない、1群から選択され;
注:
1)」。リターン;「使用:
n番目の層に第1の層が第一ケースから選択され、リターンが第二のケース(2つだけのケースを想定)のn番目の層から選択され;次いで、戻り第二ケースからN-1層を選択、どちらの場合も選択されたn番目の層のために、次にリターン第2層の場合から選択されたn-2であり、ここで後ろから選択される2層の順序、(バック戻りジャンプ機能とき最終的に選択されるたびに)
コード:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
void print_subset ( int n , int *A , int cur ) {
if ( cur == n ) {
for ( int i = 0 ; i < n ; i ++ )
if ( A[i] != 0 ) printf("%d",i) ;
printf("\n") ;
return ;
}
A[cur] = 0 ;
print_subset ( n , A , cur + 1 ) ;
A[cur] = 1 ;
print_subset ( n , A , cur + 1 ) ;
}
int main() {
int n ;
while ( scanf("%d",&n) == 1 ) {
int A[n] ;
print_subset ( n , A , 0 ) ;
}
return 0 ;
}
3.バイナリ法の
アイデア:
各サブセットには、進数の文字列で表され、0はそのような数は、この代表の数を表します。&バイナリ出力を使用;
注:
1)出力方法:使用して(1 << J)I&対応するデジタルJ ;.か否かを判断
2) "<<":左記号、結果は1 << 2 100,1 << N 2 ^ Nによって小数である
コード:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
int main() {
int n ;
while ( scanf("%d",&n) == 1 ) {
for ( int i = 0 ; i < ( 1 << n ) ; i ++ ) {
for ( int j = 0 ; j < n ; j ++ ) {
if ( ( 1 << j ) & i ) printf ("%d",j) ;
}
printf("\n") ;
}
}
return 0 ;
}