默谷资源网

专业网站建设资源库

wps/excel函数技巧:在规划求解中优化内存累积器


如图:奶牛大学招生与助学金分配的问题,要求从若干奶牛中选出恰好N头奶牛(N为奇数),在满足总助学金不超过预算F的前提下,最大化被录取奶牛分数的中位数,每组的奶牛分数和需要的助学金位于Scores和Aids行。求出选出的奶牛们最大的中位数分数。公式如下:

=LET(

a,C5:N5+C4:N4%%,

#处理数据,保证数据的唯一性

b,FILTER(a,a>0),

#删除无效数据,加快内存速度

rr,REDUCE(TRANSPOSE(b),SEQUENCE(C2-1),LAMBDA(x,y,LET(

#对数据进行累加操作,一共进行要求奶牛数量-1次操作

dd,TOCOL(TAKE(x,,1)&"+"&b),

#具体操作方式将内存中的第一行数据转成一列与数据进行合并,第一次12^2次,第二次产生数量根据下面公式的内存数据的整理情况而定

ee,DROP(REDUCE("",dd,LAMBDA(s,t,LET(

#对数据进行整理,确保内存运行效率

aaa,--TEXTSPLIT(t,"+",,1),

#将合在一起的数字分列并转化为数字,方便求和操作

bbb,XLOOKUP(aaa,a,C4:N4),

#找到分列后奖学金所对应的分数,方便提取中位数

IF(SUM(aaa)-SUM(UNIQUE(aaa,1))=0,VSTACK(TAKE(s,,3),HSTACK(t,SUM(aaa),MEDIAN(bbb))),HSTACK(TAKE(s,,3),0))))),1),

#对数据进行筛选,保留三列数据,分别是累计合并的奖金数、奖金总额、中位数,后面产生的数据通过take函数进行去除,这就是TAKE(s,,3)的作用。在横向记录方面仅保存没有错误值、且与去重后求和结果一致的数据(也就是去除有重复项的数据),不合格的数据通过hstack函数放到累加大的右面,再通过上述的take函数去除

UNIQUE(DROP(REDUCE("",UNIQUE(TAKE(TAKE(ee,,2),,-1)),LAMBDA(i,j,VSTACK(i,XLOOKUP(j,TAKE(TAKE(ee,,2),,-1),TAKE(ee,,3))))),1))))),

#对数据进行第二次筛选,将求和结果相同,但位置不同的数据只保留一条,并将重复的数据

MAX(IF(TAKE(TAKE(rr,,2),,-1)<(C3+1),TAKE(rr,,-1),0)))

#选取符合条件的中位数

公式思路:穷尽m个数据中选取n个相加,产生的数据非常大,像本题从12个数字中选取7个要达到12的7次方的数据,但数据又有很多不需要的。excel处理不了这么大的数据,所以只能想尽办法将累积器的数据变小,这样就可以提高效率同时变不可能为可能。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言