请高手帮忙优化分配算法

lichaojunxp 2008-08-07 03:21:23
请高手帮忙优化分配算法
题目
有N个果农收购各种水果,收购的原则是价格的高到低,如果出的价格相等,平均分配给对应的果农

比如有果农 A,B,C,D ,从 水果来源表 中收购

本人的设计思路
果农的信息表
果农编号 最高收购数量 收购价格
A 100 50
B 50 50
C 100 45
D 30 40

果农的收购表
果农编号 水果名 数量

比较第一次收购 苹果70斤,因为A,B出的价格最高并相对,平均分配
写入 果农的收购表
A 苹果 35
B 苹果 35

第一次收购 苹果90斤 ,平均分配到A,B完了以后再给C,以此类推。。
更新 果农的收购表
A 苹果 100(35+65)
B 苹果 50 (35+15)
C 苹果 10

果农的信息表 的果农个数,收购数量,价格都是会变化的。

AnsiString as_sql ;
AnsiString name;
AnsiString count;

ADOQuery_temp->Close();
as_sql.sprintf("select 水果名称,水果数量 from 水果来源表" );
ADOQuery_temp->SQL->Clear();
ADOQuery_temp->SQL->Add(as_sql);
ADOQuery_temp->Open();


while ( !ADOQuery_temp->Eof )
{
name = ADOQuery_temp->FieldByName("水果名称")->AsString;
count = ADOQuery_temp->FieldByName("水果数量")->AsInteger;

int i_jg; //果农出的价格
int i_zgsl; //最高收的数量

int i_gn_count; //出同一价格的果农数
int i_Curr_count = 0; //当前 果农的收购表 中已经收购到对应水果的数量
int i_pj_count; //平均分配数量
int i_sy_count; //平均分配后剩余的数量

int i_tmp1=0;
int i_tmp2=0;

int i_in_gn_id; //果农编号
int i_in_count; //分配数量


ADOQuery_temp1->Close();
//把 果农的信息表 的果农 按 收购价格 从高到低排序
as_sql.sprintf("select distinct 收购价格,count(*) 果农数量 ,sum(isnull(zm_limit,0)) 同一价格收购数量 from 果农的信息表 group by 收购价格 order by 收购价格 desc");
ADOQuery_temp1->SQL->Clear();
ADOQuery_temp1->SQL->Add(as_sql);
ADOQuery_temp1->Open();

while ( !ADOQuery_temp1->Eof )
{
///算出同一价格果农的最高收购数量
i_jg = ADOQuery_temp1->FieldByName("收购价格")->AsInteger; //按价格分档 50,45
i_gn_count = ADOQuery_temp1->FieldByName("果农数量")->AsInteger;
i_zgsl = ADOQuery_temp1->FieldByName("同一价格收购数量")->AsInteger;

i_Curr_count = 0;
ADOQuery_temp2->Close();
//把 果农的信息表 和 果农的收购表 连接起来,按最高收购数量 来排序,收购量小的在前面,以免按平均分配不到
as_sql.sprintf("select b.果农编号,isnull(sum(数量),0) 数量 from 果农的收购表 right outer join (select 果农编号,最高收购数量 from 果农的信息表 where 收购价格=%d) b on 果农的信息表.果农编号 = b.果农编号 and 水果名称 ='%s' group by b.果农编号,b.最高收购数量 order by b.最高收购数量 asc",i_jg,name);
ADOQuery_temp2->SQL->Clear();
ADOQuery_temp2->SQL->Add(as_sql);
ADOQuery_temp2->Open();

while ( !ADOQuery_temp2->Eof )
{
i_Curr_count += ADOQuery_temp2->FieldByName("数量")->AsInteger;
ADOQuery_temp2->Next();
}

ADOQuery_temp2->First();

i_pj_count = 0;
i_sy_count = 0;

if ( i_zgsl > i_Curr_count) //如果最高收购的数量 > 当前的数量,说明还能收购
{
i_pj_count = i_c_count/i_gn_count; //按果农数量来平均分配
i_sy_count = i_c_count%i_gn_count; //平均分配后的剩余水果数量

while ( !ADOQuery_temp2->Eof )
{
i_in_gn_id = ADOQuery_temp2->FieldByName("果农编号")->AsInteger;

i_tmp1 = ADOQuery_temp2->FieldByName("数量")->AsInteger; //当前果农已经收购的数量

i_tmp2 = 获取该果农编号的最高收购数量(i_in_gn_id);

//平均值+剩余值 小于 当前果农最高收购数量-当前果农已经收购数量,把 平均值+剩余值 分配给该果农
if ( i_pj_count+i_sy_count<= i_tmp2- i_tmp1)
{
i_in_count = i_pj_count+i_sy_count;
i_sy_count = 0; //全部进入,剩余值清空

if (i_in_count>0)
{
插入果农的收购表(i_in_gn_id,name,i_in_count); ///插入果农的收购表 的函数
i_c_count = i_c_count - i_in_count;
}
}
else
{
i_in_count = i_tmp2- i_tmp1;
i_sy_count = i_pj_count+i_sy_count- i_in_count; //更新剩余值

if (i_in_count>0)
{
插入果农的收购表(i_in_gn_id,name,i_in_count); ///插入果农的收购表 的函数
i_c_count = i_c_count - i_in_count;
}
}

ADOQuery_temp2->Next();
}
}
else
{
//////////////// 不能收购了

}

ADOQuery_temp1->Next();
}

ADOQuery_temp->Next();
}


这段代码已经能实现了功能,但是可能是由于数据库读写操作太多,程序没有优化好,分配水果种类过多的时候很慢,看看能不能把
数据库中的表读到TList中操作
本人对只是数据库操作比较熟,所以请教大家帮忙改改为内存操作的算法,看看能优化多少。


困了,睡觉去 zzzZZZZZZZ
...全文
109 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧