- TARGET=18925.52 #要拟合的目标值
- present=1 #present变量在循环过程中指示要在当前循环中压入堆栈的值的序号。初始化为1
- stack=c(1) #stack是作为堆栈使用的向量,用序号表示当前循环到B里的哪几个数。初始化堆栈,把B里第一个数放到堆栈里
- Len=length(B) #Len存放B的长度,也就是有几个数可以用来拟合。用一个变量来存只是为了方便后面调用
- Min_difference=max(B) #用来存放搜索到的最小偏差数值。随便用了B里最大数来初始化
- Items=c() #用来存放目前为止搜索到的最接近目标的B的子集,用序号表示B里的元素。
- while(stack[1]!=Len){ #循环,终止条件为堆栈里的数已经是B里最后一个数。
- value=sum(B[stack]) #计算当前堆栈里的B的元素和,
- if(abs(value-TARGET)<Min_difference){ #如果与目标值的差比历史最小值小,
- Min_difference=abs(value-TARGET) #就把这个差记录下来、
- Items=stack #把这个堆栈(B的子集)也记录下来。
- }
- if(present==Len){ #1.如果现在这次循环压入堆栈的是B的最后一个数,那么需要后退:不仅需要把这个数从堆栈扔掉,还要把堆栈倒数第二个数换成下一个。
- present=stack[length(stack)-1]+1 #(下一个要压入堆栈的应该是现在堆栈里倒数第二个数在B的下一个数、)
- stack=stack[c(-length(stack),-(length(stack)-1))] #(把堆栈最后的两个数扔掉。)
- }else{ #2.如果现在这次循环压入堆栈的不是B的最后一个数,那么还不需要后退,但也要分情况;
- if(value >TARGET){ #2.1如果当前子集的和已经超过目标值,再加新的数只会距离目标更远,所以直接把堆栈里最后一个数换成B的下一个
- present=stack[length(stack)]+1 #(下一个要压入堆栈的是现在堆栈里最后一个数在B的下一个数、)
- stack=stack[-length(stack)] #(把堆栈最后一个数扔掉。)
- }else{ #2.2如果当前子集的和还没超过目标值,尝试增加B下一个新的数进堆栈里。
- present=stack[length(stack)]+1 #(下一个要压入堆栈的是现在堆栈里最后一个数在B的下一个数。)
- }
- }
- stack=c(stack,present) #把要压进堆栈里的数压进堆栈。然后循环
- }
- result=list(ERROR=Min_difference,INDEXs=Items,ITEMs=B[Items]) #输出结果。ERROR是和目标的偏差值,INEDXs是子集里元素在B的序号,ITEMs是子集里的元素值


雷达卡






惭愧! 看了半天 没看懂
京公网安备 11010802022788号







