第一种方法:用任意一种方法遍历,遇到比之前更接近的则……,一样接近的则根据题目规则判断是否替换。
double min_delta = DBL_MAX;
unsigned min_count = 0;
unsigned min_mask = 0;
for( unsigned mask=1; mask!=1024; ++mask )
{
sum = mask对应bit为1的需要参与求和,假如 mask 是二进制的 1101,那么 a[0]*1 +a[1]*0 + a[2]*1 + a[3]*1 + ……
if( sum和b的差比min_delta更小 或 与min_delta一样大但…… )
{
……
}
}
第二种方法:直接按照题目规则遍历,遇到比之前更接近的则……。一样接近的就可以直接舍弃。
double min_delta = DBL_MAX;
for( unsigned mask=1; mask!=-1; mask=
next(maks) )
{
sum = mask对应bit为1的需要参与求和,假如 mask 是二进制的 1101,那么 a[0]*1 +a[1]*0 + a[2]*1 + a[3]*1 + ……
if( sum和b的差比min_delta更小 )
{
……
}
}
next函数就比较复杂了
unsigned next( unsigned bits )
{
int leftzero = 10-1;
for( ; leftzero>=0 && (bits&(1u<<leftzero))!=0; --leftzero );
if( leftzero == -1 )
return leftzero;
int afterone = leftzero-1;
for( ; afterone>=0 && (bits&(1u<<afterone))==0; --afterone );
if( afterone == -1 )
return (bits>>leftzero)|1u;
return ((((0-1u)<<(leftzero+1))&bits)>>(leftzero-afterone-1))|(1u<<(afterone+1))|(((1u<<afterone)-1)&bits);
}