简要分析:
其实看起来毫无思路可言,不过想通了,还是挺简单的
1,2,4,8,16,32都是2的幂次
所以我们可以在二进制的角度来考虑
无非就是一共6个位置,每个位置非0即1
然后我选择用dfs来写,因为dp是在不是很熟,只会简单的,要是有小伙伴用dp写的可以打在评论区,谢谢
先看一眼dfs的图:
1 1 1 1 1 1
0 0 0 0 0 0
就是这样了,在里面绕来绕去就可以了
dfs里面传的参数,x是当前的位置,sum是当前的和
就这么多了,大家自己看吧
#include <iostream>
#include <cmath>
using namespace std;
int a[ 2 ] [ 6 ] = {
{
1 , 1 , 1 , 1 , 1 , 1 } , {
0 , 0 , 0 , 0 , 0 , 0 } } ;
int ans;
int dp[ 7 ] ;
int poww ( int i) {
int mul= 1 ;
for ( int j= 1 ; j<= i; j++ ) {
mul= mul* 2 ;
}
return mul;
}
void dfs ( int x, int sum) {
if ( x== 6 ) {
if ( sum> 0 && sum<= 50 ) {
ans++ ;
for ( int i= 0 ; i< 6 ; i++ ) {
printf ( "%d" , dp[ i] ) ;
}
printf ( "\n" ) ;
}
return ;
}
for ( int i= 0 ; i< 2 ; i++ ) {
dp[ x] = a[ i] [ x] ;
dfs ( x+ 1 , sum+ poww ( x) * a[ i] [ x] ) ;
}
}
int main ( ) {
dfs ( 0 , 0 ) ;
cout<< ans<< endl;
return 0 ;
}