在n个不同的整数中,任意取若干个,要求它们的和是7的倍数,问有几种取法。输入数据第一行是整数t,表示有t组数据。接下来有t行,每行是一组数据,第一个数是n(1<=n<=16),表示要从n个整数中取数,接下来就是n个整数。对每组数据,输出一行,表示取法的数目(一个都不取也算一种取法)。
输入样例
3
3 1 2 4
5 1 2 3 4 5
12 1 2 3 4 5 6 7 8 9 10 11 12
输出样例
2
5
586
解题思路:总体思路为枚举法。对n个整数,有pow(2,n)种取法。每种取法都算一下是不是7的倍数。可以把每个整数的状态(取或者不取)用一个二进制位表示,1为取,0为不取。可以发现,n位二进制数和n个整数的2^n种取法正好是一一对应的。例如,对于4个整数,二进制数1111(十进制15)代表全取,0000代表全不取。那么让一个变量i从0循环至15,就可以遍历所有的取法。对于i的每个取值,用位运算找出哪些位为1,让其对应的整数位求和即可。
代码:
# include <cmath>
#include<iostream>
using namespace std;
int main()
{
int t;
int number[50];
int Bit(int binary, int rank);
cin >> t;
while (t--)
{
int ways = 0; //取法
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> number[i];
}
int tmp = pow(2.0, n);
for (int x = 0; x < tmp; ++x) {
int sum = 0; //总和
for (int i = 0; i < n; ++i) {
if (Bit(x, i)) sum = sum + number[i];
}
if (sum % 7 == 0) ways++;
}
cout << ways<<endl;
}
return 0;
}
int Bit(int binary, int rank) //对于二进制数binary,返回其第rank位
{
return ((1 << rank)&binary);
}