【无标题】从长度为n的数组里选出m个数使和为固定值sum。

`在这里插入代码片:
``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;	
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

LZ_Yun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值