求算法 如有1W条数据,每条数据的值在 4.7500-5.2500之间,要求任意10条数据组合成一个新的数据,并且值在50.0000-50.5000之间,满足这样的要求的算法,求大侠提供一下可用的思路,1W条数据的值不均匀分布的,但都在那个范围内. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 Dim dblData As Double Dim LngData As Double dblData = 4.75 LngData = (dblData * 10) + 2.5 MsgBox LngData dblData = (LngData - 2.5) / 10 MsgBox dblData 每条数据对应一个ID,我要获取这些组合的ID,并且每14个在要求范围内的组合赋一个NEWID,数据不能重复使用.搜索-剪枝的方法我试过了,因为实际上是需要14个组合成1个,所以基本循环不了,循环量太大了 仅供参考//给出12个随机数,分成三组求和,每组的个数不定,要求求出来的三个数之间相差最小,最完美的情况是三个数相等.#include <stdlib.h>#include <stdio.h>#include <time.h>#include <math.h>#include <limits.h>int i,j,k;int g[12][3]={//可能的分组大小 { 1, 1,10}, { 1, 2, 9}, { 1, 3, 8}, { 1, 4, 7}, { 1, 5, 6}, { 2, 2, 8}, { 2, 3, 7}, { 2, 4, 6}, { 2, 5, 5}, { 3, 3, 6}, { 3, 4, 5}, { 4, 4, 4},};int n[12];int m[12];int f[12];//当前最小时各数int g1,g2,g3;//1,2,3组可分配的个数int n1,n2,n3;//1,2,3组已分配的个数int f1,f2;//当前最小时1,2组的个数int s1,s2,s3;//123组的和int d;//1-2,2-3,3-1组中各数和之间差的绝对值之和int dmin=INT_MAX;//保存当前d的最小值void swap(int *pi1,int *pi2) { int t; t=*pi1;*pi1=*pi2;*pi2=t;}void test() { s1=0; for (i=0;i<g1;i++) s1=s1+n[i]; s2=0; for (i=g1;i<g1+g2;i++) s2=s2+n[i]; s3=0; for (i=g1+g2;i<12;i++) s3=s3+n[i]; d=abs(s1-s2)+abs(s2-s3)+abs(s3-s1); if (d<dmin) { dmin=d; f1=g1; f2=g2; for (i=0;i<12;i++) f[i]=n[i]; printf("("); for (i=0;i<g1;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1+g2;i<12;i++) printf("%2d,",n[i]); printf(") %4d\n",dmin); } else { printf("("); for (i=0;i<g1;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1+g2;i<12;i++) printf("%2d,",n[i]); printf(") %4d\n",d); }}void main() { srand(time(NULL)); for (i=0;i<12;i++) m[i]=rand()%100; for (i=0;i<12;i++) printf("%2d,",m[i]); printf("\n"); for (i=1;i<12;i++) { for (j=0;j<i;j++) { if (m[i]>m[j]) swap(&m[i],&m[j]);//冒泡排序从大到小 } } for (i=0;i<12;i++) printf("%2d,",m[i]); printf("\n"); for (k=0;k<12;k++) {//在12种分组方法中 //取第i种分组方法 g1=g[k][0]; g2=g[k][1]; g3=g[k][2]; printf("%2d-%2d,%2d,%2d\n",k,g1,g2,g3); //将从大到小12个数双向轮流分配到三个组中 n1=0; n2=0; n3=0; for (j=0;j<12;j++) { switch (j%6) { case 0: redo: if (n1<g1) { n[n1]=m[j]; n1++; break; } case 1: if (n2<g2) { n[g1+n2]=m[j]; n2++; break; } case 2: if (n3<g3) { n[g1+g2+n3]=m[j]; n3++; break; } case 3: if (n3<g3) { n[g1+g2+n3]=m[j]; n3++; break; } case 4: if (n2<g2) { n[g1+n2]=m[j]; n2++; break; } case 5: if (n1<g1) { n[n1]=m[j]; n1++; break; } default:goto redo; } } test(); } printf("---------------------------------------------------\n"); g1=f1; g2=f2; for (i=0;i<12;i++) n[i]=f[i]; printf("("); for (i=0;i<g1;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]); printf(") ("); for (i=g1+g2;i<12;i++) printf("%2d,",n[i]); printf(") %4d\n",dmin);} 读影片的文件头,能否得到影片的像素是几 X 几 ? 最近的时间查询 supergreenbean(超级绿豆 - 放暑假了),请进来,有问题询问! VB的日期控件 初学者请教如何在多个打开的excel文件中指定其中一个进行操作 关于鼠标钩子,100分 一个很急的问题。100 怎样将GetDC(0)的内容生成一个位图句柄?(用API) 如何判断webbrowser.document对象无效 如何用 WINSOCK 取得上网时的IP 如何制作网址更新器? VB 怎样建立文件上传下载中转站
Dim dblData As Double
Dim LngData As Double
dblData = 4.75
LngData = (dblData * 10) + 2.5
MsgBox LngData
dblData = (LngData - 2.5) / 10
MsgBox dblData
搜索-剪枝的方法我试过了,因为实际上是需要14个组合成1个,所以基本循环不了,循环量太大了
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <limits.h>
int i,j,k;
int g[12][3]={//可能的分组大小
{ 1, 1,10},
{ 1, 2, 9},
{ 1, 3, 8},
{ 1, 4, 7},
{ 1, 5, 6},
{ 2, 2, 8},
{ 2, 3, 7},
{ 2, 4, 6},
{ 2, 5, 5},
{ 3, 3, 6},
{ 3, 4, 5},
{ 4, 4, 4},
};
int n[12];
int m[12];
int f[12];//当前最小时各数
int g1,g2,g3;//1,2,3组可分配的个数
int n1,n2,n3;//1,2,3组已分配的个数
int f1,f2;//当前最小时1,2组的个数
int s1,s2,s3;//123组的和
int d;//1-2,2-3,3-1组中各数和之间差的绝对值之和
int dmin=INT_MAX;//保存当前d的最小值
void swap(int *pi1,int *pi2) {
int t;
t=*pi1;*pi1=*pi2;*pi2=t;
}
void test() {
s1=0;
for (i=0;i<g1;i++) s1=s1+n[i];
s2=0;
for (i=g1;i<g1+g2;i++) s2=s2+n[i];
s3=0;
for (i=g1+g2;i<12;i++) s3=s3+n[i];
d=abs(s1-s2)+abs(s2-s3)+abs(s3-s1);
if (d<dmin) {
dmin=d;
f1=g1;
f2=g2;
for (i=0;i<12;i++) f[i]=n[i];
printf("(");
for (i=0;i<g1;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);
printf(") %4d\n",dmin);
} else {
printf("(");
for (i=0;i<g1;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);
printf(") %4d\n",d);
}
}
void main() {
srand(time(NULL));
for (i=0;i<12;i++) m[i]=rand()%100;
for (i=0;i<12;i++) printf("%2d,",m[i]);
printf("\n");
for (i=1;i<12;i++) {
for (j=0;j<i;j++) {
if (m[i]>m[j]) swap(&m[i],&m[j]);//冒泡排序从大到小
}
}
for (i=0;i<12;i++) printf("%2d,",m[i]);
printf("\n");
for (k=0;k<12;k++) {//在12种分组方法中
//取第i种分组方法
g1=g[k][0];
g2=g[k][1];
g3=g[k][2];
printf("%2d-%2d,%2d,%2d\n",k,g1,g2,g3);
//将从大到小12个数双向轮流分配到三个组中
n1=0;
n2=0;
n3=0;
for (j=0;j<12;j++) {
switch (j%6) {
case 0:
redo:
if (n1<g1) {
n[n1]=m[j];
n1++;
break;
}
case 1:
if (n2<g2) {
n[g1+n2]=m[j];
n2++;
break;
}
case 2:
if (n3<g3) {
n[g1+g2+n3]=m[j];
n3++;
break;
}
case 3:
if (n3<g3) {
n[g1+g2+n3]=m[j];
n3++;
break;
}
case 4:
if (n2<g2) {
n[g1+n2]=m[j];
n2++;
break;
}
case 5:
if (n1<g1) {
n[n1]=m[j];
n1++;
break;
}
default:goto redo;
}
}
test();
}
printf("---------------------------------------------------\n");
g1=f1;
g2=f2;
for (i=0;i<12;i++) n[i]=f[i];
printf("(");
for (i=0;i<g1;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1;i<g1+g2;i++) printf("%2d,",n[i]);
printf(") (");
for (i=g1+g2;i<12;i++) printf("%2d,",n[i]);
printf(") %4d\n",dmin);
}