以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  求和问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=153596)

--  作者:keli0917
--  发布时间:2020/8/16 18:31:00
--  求和问题

比如报关单出口,第一出口数量是1000件。第2次出口数量是600件。

工厂第一次销售开的发票可能是,100+200+300+400,100+200+700,也可能是600+400,也可能是直接1000件,等等各种可能组合。

工厂第二次销售开的发票可能是,100+500,200+400,300+300等各种可能。

现在假设第一次开的发票数量组合是100+200+700,第二次开的发票数量组合是200+400,两次开票共有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;
        }
    }  
} 

 


--  作者:有点蓝
--  发布时间:2020/8/16 20:52:00
--  
这代码好像是C++的,我也看不太懂。大概好像可能是遍历所有的组合,然后求和判断,就是把所有的可能性结果都求出来:

比如先计算2个数字的组合:-10+45、-10+35、-10+99、....
接着计算3个数字的组合:-10+45+35、-10+45+99、....
然后是4个数字、5个数字,...,计算完毕标记符合要求的组合

--  作者:keli0917
--  发布时间:2020/8/16 20:59:00
--  

                            Dim num2 As Byte
                            Dim Filter2 As String = "关联号=\'" & dr("关联号") & "\' and 商品代码=\'" & dr("商品代码") & "\' and [商品名称]  Like " & "\'%" & dr("商品名称") & "\' and 出口序号 Is Null"
                            \'   MessageBox.Show(filter2)
                            Dim dr2s As List(Of DataRow) = DataTables("进货明细表").sqlSelect(Filter2,"","序号") \'找出符合条件的行
                            \'     MessageBox.Show(dr2s.count)
                           
                            If dr2s.count >0 Then
                                Dim Sum2 As Double = 0
                               
                                For Each dr2 As DataRow In dr2s \'循环每一行
                                    If  dr2.Isnull("出口序号")  Then
                                        Sum2 = Sum2 + dr2("数量")
                                        \'MessageBox.Show(sum2)
                                        If sum2 = dr("出口数量")  Then
                                            dr2("出口序号")= dr("序号")
                                            Exit  For
                                        Else If sum2 < dr("出口数量")  Then
                                            dr2("出口序号")= dr("序号")
                                        End If
                                    End If
                                    dr2.save()
                                   
                                Next
                               
                               
                            End If

[此贴子已经被作者于2020/8/16 21:01:07编辑过]

--  作者:keli0917
--  发布时间:2020/8/16 21:03:00
--  
我的算法有问题啊,,,,哎。求高手帮忙。其实就是找到等于1000的几个数字所在的行,然后标记上序号。
--  作者:有点蓝
--  发布时间:2020/8/16 21:34:00
--  
请上传实例测试