读书人

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

发布时间: 2012-06-10 14:03:15 作者: rapoo

遇到个算法方面的问题,高手来帮帮忙~~
有一大堆数,几万个,取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 < 9Private Const LENGTH = 100000Private Const MAX_NUM = 8Private Const MIN_NUM = 2Private ArrNum(LENGTH) As LongPrivate 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)    NextEnd SubPrivate 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.PrintEnd Sub 

读书人网 >VB

热点推荐