比如报关单出口,第一出口数量是1000件。第2次出口数量是600件。
工厂第一次销售开的fa piao可能是,100+200+300+400,100+200+700,也可能是600+400,也可能是直接1000件,等等各种可能组合。
工厂第二次销售开的fa piao可能是,100+500,200+400,300+300等各种可能。
现在假设第一次开的fa piao数量组合是100+200+700,第二次开的fa piao数量组合是200+400,两次开piao共有5个数据。
现在我需要编程,从5个数据中找出等于1000的其中一个组合(也就是从N个数据中找出等于1000的其中一个组合,并且对每一个数据标记)
我找到一个算法,但是看不明白。供参考。
非递归做法。
比如数组中有10个数字 比如{-10,45,35,99,10,6,9,20,17,18} , sum为35,用二进制的0000000000~1111111111代表某个数字是否被选中,如果数字是0101010101代表45,99,6,20,18五个数字被选出来了。接着我们只需要计算着五个数是否等于我们要最终需要sum。代码如下:
void CalSum(vector<int> &nums, int result)
{
int len = nums.size();
int bit = 1 << len;
for (int i = 1; i < bit; i++)//从1循环到2^N
{
int sum = 0;
vector<int> tmp;
for (int j = 0; j < len; j++)
{
if ((i & 1 << j) != 0)//用i与2^j进行位与运算,若结果不为0,则表示第j位不为0,从数组中取出第j个数
{
sum += nums[j];
tmp.push_back(nums[j]);
}
}
if (sum == result)
{
for (vector<int>::iterator iter = tmp.begin(); iter != tmp.end(); iter++)
{
cout << *iter << " ";
}
cout << endl;
}
}
}