遇到个算法方面的有关问题,高手来帮帮忙~

遇到个算法方面的问题,高手来帮帮忙~~
有一大堆数,几万个,取4个,加一起要求在20-25之间
如果有的话就记录下来,然后把这4个数去掉,以后不再匹配了,剩下的数继续重复以上操作,直到明确没有匹配的可能了停止,输出所有匹配成功的结果

------解决方案--------------------
仅供参考
C/C++ code
//n个(2<=n<=20)整数(整数范围-10<=x<=10),判断是否可以从这n个数中找到若干个数,其和为10
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <algorithm>
using namespace std;
int MAXN=20;
int MINN=2;
int x[20];
int n,i,j,k,sum;
int main() {
    srand((unsigned)time(NULL));
    n=MINN+rand()%(MAXN-1);
    for (i=0;i<n;i++) {
        x[i]=-10+rand()%21;
        printf("%d,",x[i]);
    }
    printf("\n");
    sort(&x[0],&x[n]);
    do {
        for (i=2;i<=n;i++) {
            sum=0;
            k=n/2-i/2;
            for (j=k;j<k+i;j++) {
                sum+=x[j];
            }
            if (10==sum) {
                for (j=k;j<k+i;j++) {
                    if (j==k+i-1) {
                        printf("%d==10\n",x[j]);
                    } else {
                        printf("%d+",x[j]);
                    }
                }
                printf("YES\n");
                return 1;
            }
        }
    } while (next_permutation(&x[0],&x[n]));
    printf("NO\n");
    return 0;
}

------解决方案--------------------
好久没来了,冒个泡,提供一个思路.....

VB code

Option Explicit

'前提:数组中的值为正整数,且 1 < x < 9
Private Const LENGTH = 100000
Private Const MAX_NUM = 8
Private Const MIN_NUM = 2

Private ArrNum(LENGTH) As Long


Private Sub Form_Load()
'生成一个length长度的测试数组,最大值8最小值2
    Dim i As Long
    
    Randomize
    For i = 0 To LENGTH
        ArrNum(i) = Int((MAX_NUM - MIN_NUM + 1) * Rnd + MIN_NUM)
    Next
End Sub


Private Sub Command1_Click()

    Dim Total(MIN_NUM To MAX_NUM) As Long
    Dim Flag As Boolean
    Dim i As Long, j As Long, k As Long
    Dim Tmp(3) As Long, Temp As Long
    Dim n As Long
    
    Dim lCount As Long
    
    
    '统计数组arrNum中每个值出现的次数
    For i = 0 To LENGTH
        Total(ArrNum(i)) = Total(ArrNum(i)) + 1
    Next
    '调试输出统计结果
    For i = MIN_NUM To MAX_NUM
        Debug.Print Total(i);
    Next
    Debug.Print
    
    '筛选思路
    '数值2到8抽4个数字组合,合计值在20到25之间
    '最小的组合是2288(=20),最大的组合是8872(=25)
    For i = 2288 To 8872
        Flag = True
        Temp = 0
        For j = 0 To 3  '将i拆分为4个值
            Tmp(j) = Mid(i, j + 1, 1)
            If Tmp(j) < 2 Or Tmp(j) > 8 Then
                Flag = False
                Exit For
            Else
                Temp = Temp + Tmp(j)
            End If
        Next
        If Flag Then    '值范围符合条件的
            If Temp >= 20 And Temp < 26 Then    '合计符合条件的
                lCount = 0
                Do
                    For j = 0 To 3
                        If Total(Tmp(j)) > 0 Then   ''检查各值在arrNum中当前的个数
                            Total(Tmp(j)) = Total(Tmp(j)) - 1
                        Else
                            '还原j的操作中减去的统计值
                            For k = j - 1 To 0 Step -1
                                Total(Tmp(k)) = Total(Tmp(k)) + 1
                            Next k
                            Flag = False
                            Exit For
                        End If
                    Next j
                    If Flag Then
                        'Debug.Print i '直接输出结果
                            lCount = lCount + 1
                    End If
                Loop Until Not Flag
                If lCount > 0 Then Debug.Print i, lCount & "个"
            End If
        End If
    Next i
    
    '调试输出,数组arrNum中各值剩余统计结果
    For i = MIN_NUM To MAX_NUM
        Debug.Print Total(i);
    Next
    Debug.Print
End Sub