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