发票和单号进行分摊算法

求一个算法
我这里需要做一个发票报销和单号有关的分摊功能

场景:发票张数是n,报销单号是m,发票的金额和报销单号的金额一定是一致的,现在要进行分摊,比如五张发票对应三个单号,总金额为两万,发票号和发票金额分别为 (A001,5000)  (A002,4000) (A003,2000) (A004,6000)  (A005,3000)   三个单号分别为(B001,10000),
(B002,2000),(B003,8000)
希望产生的分摊轨迹
(A001,5000)  (B001,5000)
(A002,4000) (B001,4000)
(A003,1000) (B001,1000)
(A003,1000) (B002,1000)
(A004,1000) (B002,1000)
(A004,5000) (B003,5000)
(A005,3000) (B003,3000)

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以看下这个问题的回答https://ask.csdn.net/questions/7735290
  • 这篇博客也不错, 你可以看下一种基于帧差分算法的简易视频报警算法的设计与实现
  • 除此之外, 这篇博客: 【算法和数据结构】排序算法全解析中的 选择排序的第一种写法【不稳定,破坏顺序结构】 部分也许能够解决你的问题, 你可以仔细阅读以下内容或者直接跳转源博客中阅读:

    选择排序的思想是:双重循环遍历数组,每经过一轮比较,找到最小元素的下标,将其交换至首位。

    public static void selectionSort_1(int[] arr)
    {
        int minIndex;//需要一个最小值索引下标
        for (int i = 0; i < arr.Length-1; i++) 
        {
            minIndex = i; //每一个位置的最小值从头开始
            for (int j = i+1; j < arr.Length; j++)
            {
                if (arr[minIndex]>arr[j]) //当前最小值位置 > J位置
                {
                    minIndex = j;//记录最新的最小值位置,循环结束后最后得出最小值位置
                }
            }
            //交换当前位置和最小值位置
            arr[minIndex] = arr[minIndex] + arr[i];
            arr[i] = arr[minIndex] - arr[i]; //现在当前位置变为最小值
            arr[minIndex] = arr[minIndex] - arr[i]; //把原先的最小值位置交换到前面
        }
    }
    

    动图演示
    在这里插入图片描述
    冒泡排序和选择排序有什么异同?
    相同点:

    1. 都是两层循环,时间复杂度都为 O(n^2)
    2. 都只使用有限个变量,空间复杂度 O(1)

    不同点:

    1. 冒泡排序在比较过程中就不断交换;而选择排序增加了一个变量保存最小值 / 最大值的下标,遍历完成后才交换,减少了交换次数。
    2. 最重要的不同点:冒泡排序法是稳定的,选择排序法是不稳定的。

    【不稳定的例子】
    选择排序中,最小值和首位交换的过程可能会破坏稳定性。比如数列:[2, 2, 1],在选择排序中第一次进行交换时,原数列中的两个 2 的相对顺序就被改变了,因此,我们说选择排序是不稳定的。

  • 您还可以看一下 吴刚老师的【吴刚大讲堂】电商视觉的排版与应用方法课程中的 订单页面的表单视觉优化及细节处理方法小节, 巩固相关知识点

如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^