`在这里插入代码片:
``c
//#include<limits.h>
/*
从长度为n的数组里选出m个数使和为固定值sum。
我们可以在第三个代码的基础上修改,
每选出一个二进制数,
我们可以先计算这个二进制数中1的个数(也可以在后面计算)
如果个数等于m,再对这个m个数相加看是否等于sum。
代码如下:
*/
//计算和为K的二进制1的个数
int NumOf1(int K)
{
int cnt=0;
while(K)
{
K=K&(K-1);//例如 传入参数为3 3&2 二进制:0.0.0.00000111 &0.0.0.00000011 ->0.0.0.00000011 cnt=1
// 依次类推 ->0.0.0.00000001 cnt=2
cnt++; // ->0.0.0.00000000 cnt=3
} // 退出while循环 ,返回cnt值
return cnt;
}
//计算和值
void CalculatorSum(int a[],int n,int K,int m)// 传入的参数依次为 数组 a[],数组元素个数 n,和值K,有m个元素被选中
{
//int temp[INT_MAX];
int temp[10];
int t;
int bit=1<<n;//计算比特位 意思是向左移动 n位 即,当n=10时:0000000001~1111111111
int i,j,k;
for(i=1;i<bit;i++) //从1循环到2^N
{
int sum=0;
t=0;
if(NumOf1(i)==m)
{
for(j=0;j<n;j++)//判断低n位的bit位
{
if((i&1<<j)!=0) //用i与上2^j,若结果不为0,则表示第j位不为0,从数组中选出第j个数 例如:10000 00011 即选出第1个,第8个第9个数 即 1 9 10
{
sum+=a[j];//求和
temp[t++]=a[j];
}
}
//打印temp数组并显示到视屏上
if(sum==K)
{
printf("%d = %d",K,temp[0]);
for(k=1;k<t;k++)
{
printf("+%d",temp[k]);
}
printf("\n");
}
}
}
}
int main()
{
int a[10]={1,2,3,4,5,6,7,8,9,10};
int M,K;
scanf("%d%d",&M,&K); //从a中10个数中选出M个数使其和为K
//int m=NumOf1(K); //计算和为K的二进制1的个数
CalculatorSum(a,10,K,M); //传参
return 0;
}