暴力アルゴリズム:0〜n個発生するように配置されています

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 ; 
}
发布了4 篇原创文章 · 获赞 1 · 访问量 134

おすすめ

転載: blog.csdn.net/QQQ899/article/details/104706427