数据库有一大堆数据,如
ID Name Num ZU
1 XX1 53 Null
2 XX2 44 Null
3 XX3 36 Null
4 XX4 47 Null
5 XX5 54 Null
6 XX6 21 Null
7 XX7 80 Null
8 XX8 99 Null
9 XX9 103 Null
10 XX10 25 Null
11 XX11 85 Null
12 XX12 75 Null
13 XX13 14 Null
14 XX14 76 Null
15 XX15 45 Null
16 XX16 82 Null
17 XX17 24 Null
18 XX18 32 Null
19 XX19 46 Null
20 XX20 55 Null
21 XX21 77 Null
22 XX22 90 Null
.
.
.
.
N XXN N现在要求根据Num列,将数据分成多个组,每组的Num值的合计的数值相差不大,然后将组的序号放到“ZU”这列。
分不多,先给100,不够另开贴在给
ID Name Num ZU
1 XX1 53 Null
2 XX2 44 Null
3 XX3 36 Null
4 XX4 47 Null
5 XX5 54 Null
6 XX6 21 Null
7 XX7 80 Null
8 XX8 99 Null
9 XX9 103 Null
10 XX10 25 Null
11 XX11 85 Null
12 XX12 75 Null
13 XX13 14 Null
14 XX14 76 Null
15 XX15 45 Null
16 XX16 82 Null
17 XX17 24 Null
18 XX18 32 Null
19 XX19 46 Null
20 XX20 55 Null
21 XX21 77 Null
22 XX22 90 Null
.
.
.
.
N XXN N现在要求根据Num列,将数据分成多个组,每组的Num值的合计的数值相差不大,然后将组的序号放到“ZU”这列。
分不多,先给100,不够另开贴在给
1.用sum()求出数据表中总和,再除去总记录数,即一个平均数.
2.num值大于平均数的单独分组.
3.num值小于平均数的,先按降序排列.逐一累加.接近平均数则分一组.
4.每分一组就重复执行第3步.直到分完.
这个好像是NP问题了
这个方法需改进下.
这个算法的要求你描述的不是很清楚,我的理解是这样:
1.将N条数据分组,每组Num总和相等,设为S(不知道相差不大是什么意思,这里我按相等了).
2.每组的记录数相等,将每组的记录数设为M
3.单条记录Num值大于S的单独分组.
按以上条件分组的话,主要是要确定两个要点:
1.S的取值范围.
首先仍然是先求一个Num的平均数.设为V;将其做为S的最小取值.
再用总记录数N/2*V,将其做为S的最在值(假设最少应分两组).
这样每组Num总和的取值范围就明确了,即V<=S<=(N/2*V),然后就程式遍历取值就可以了.
2.M的取值范围.
每组记录数最少得有1条,所以M最小取值应为1.最大值在S明确后可以通过程式取得总和等于S最在值.
这样M的取值范围也搞定了.
现在程式大至写法也明确了.
for V=S to (N/2*V) do
begin
先将单条记录大于V的值单独分一组.
for M=1 to V do
begin
列出剩下未分组的记录.(排序方式不一样,分组结果可能也不一样)
将符合V和M条件的分组.
记录分组情况
end;
if 仍有未分组的记录 then
清除此次分组情况记录
end;
最后列出所有可能的分组.