Foxtable(狐表)用户栏目专家坐堂 → 求和问题


  共有2127人关注过本帖树形打印复制链接

主题:求和问题

帅哥哟,离线,有人找我吗?
keli0917
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:257 积分:2448 威望:0 精华:0 注册:2018/5/21 16:49:00
求和问题  发帖心情 Post By:2020/8/16 18:31:00 [只看该作者]

比如报关单出口,第一出口数量是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;
        }
    }  
} 

 


 回到顶部
帅哥,在线噢!
有点蓝
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107343 积分:545982 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/8/16 20:52:00 [只看该作者]

这代码好像是C++的,我也看不太懂。大概好像可能是遍历所有的组合,然后求和判断,就是把所有的可能性结果都求出来:

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

 回到顶部
帅哥哟,离线,有人找我吗?
keli0917
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:257 积分:2448 威望:0 精华:0 注册:2018/5/21 16:49:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:童狐 帖子:257 积分:2448 威望:0 精华:0 注册:2018/5/21 16:49:00
  发帖心情 Post By:2020/8/16 21:03:00 [只看该作者]

我的算法有问题啊,,,,哎。求高手帮忙。其实就是找到等于1000的几个数字所在的行,然后标记上序号。

 回到顶部
帅哥,在线噢!
有点蓝
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:超级版主 帖子:107343 积分:545982 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2020/8/16 21:34:00 [只看该作者]

请上传实例测试

 回到顶部