有一堆數字如 5,6,10,50,90,10,7,2,6,1 共10個 總計187 ,但有限制條件,不管怎麼加不可以超過100且要接近100
問:有幾種組合
問:如何電腦自動配置,列出組合明細
假如可以組合 4組
如第1組 5,6,10,50,7,2,6,1
如第2組 10+90
通过以下递归函数,可以实现
public subroutine wf_dg (long a[], integer start, string as, long al_sum, long max, long min, datastore ads) if al_sum >= max then return if start > upperbound(a) then return int i; long ll_sum, row; string ls for i = start to upperbound(a) ll_sum = al_sum + a[i] if ll_sum <= max then if as = '' then ls = string(a[i]) else ls = as + ',' + string(a[i]) end if if ll_sum >= min then row = ads.insertrow(0);ads.setitem(row, 's', ls);ads.setitem(row, 't', ll_sum) end if if ll_sum = max then continue wf_dg(a, i + 1, ls, ll_sum, max, min, ads) end if next end subroutine
递归函数的调用入口如下, lds用来存储组合明细, dw_1是窗口中用来显示组合明细的控件。
datastore lds lds = create datastore lds.dataobject = 'd_result' string ls, ls_sub ls = mle_1.text + ',' long ll[], i do while true i = posw(ls, ',') if i <= 0 then exit if i = 1 then ls = midw(ls, 2); continue end if ls_sub = leftw(ls, i - 1) ls = midw(ls, i + 1) if not isnumber(ls_sub) then continue //非数字 ll[upperbound(ll) + 1] = long(ls_sub) loop wf_dg(ll, 1, '', 0, 100, 90, lds) //统计大于等于90小于等于100的所有组合 lds.setsort("t d, s d"); lds.sort() lds.rowscopy( 1, lds.rowcount(), primary!, dw_1, 1, primary!) destroy lds
附上各对象的导出内容 d_result.srd
$PBExportHeader$d_result.srd release 9; datawindow(units=0 timer_interval=0 color=1073741824 processing=1 HTMLDW=no print.printername="" print.documentname="" print.orientation = 0 print.margin.left = 110 print.margin.right = 110 print.margin.top = 96 print.margin.bottom = 96 print.paper.source = 0 print.paper.size = 0 print.canusedefaultprinter=yes print.prompt=no print.buttons=no print.preview.buttons=no print.cliptext=no print.overrideprintjob=no print.collate=yes hidegrayline=no grid.lines=0 ) header(height=80 color="536870912" ) summary(height=0 color="536870912" ) footer(height=0 color="536870912" ) detail(height=76 color="536870912" ) table(column=(type=char(1000) updatewhereclause=yes name=s dbname="s" ) column=(type=long updatewhereclause=yes name=t dbname="t" ) ) text(band=header alignment="2" text="组合情况" border="0" color="33554432" x="155" y="12" height="56" width="1157" html.valueishtml="0" name=s_t visible="1" font.face="宋体" font.height="-9" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" ) text(band=header alignment="2" text="总和" border="0" color="33554432" x="1321" y="12" height="56" width="256" html.valueishtml="0" name=t_t visible="1" font.face="宋体" font.height="-9" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" ) column(band=detail id=2 alignment="1" tabsequence=20 border="0" color="33554432" x="1321" y="12" height="68" width="256" format="[general]" html.valueishtml="0" name=t visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes edit.imemode=0 font.face="宋体" font.height="-9" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" ) column(band=detail id=1 alignment="0" tabsequence=10 border="0" color="33554432" x="155" y="12" height="68" width="1157" format="[general]" html.valueishtml="0" name=s visible="1" edit.limit=0 edit.case=any edit.focusrectangle=no edit.autoselect=yes edit.autohscroll=yes edit.imemode=0 font.face="宋体" font.height="-9" font.weight="400" font.family="2" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" ) compute(band=detail alignment="2" expression="getrow()"border="0" color="33554432" x="9" y="12" height="60" width="137" format="[GENERAL]" html.valueishtml="0" name=compute_1 visible="1" font.face="宋体" font.height="-9" font.weight="400" font.family="0" font.pitch="2" font.charset="134" background.mode="1" background.color="536870912" ) htmltable(border="1" ) htmlgen(clientevents="1" clientvalidation="1" clientcomputedfields="1" clientformatting="0" clientscriptable="0" generatejavascript="1" encodeselflinkargs="1" netscapelayers="0" ) export.xml(headgroups="1" includewhitespace="0" metadatatype=0 savemetadata=0 ) import.xml() export.pdf(method=0 distill.custompostscript="0" xslfop.print="0" )
w.srw
$PBExportHeader$w.srw forward global type w from window end type type st_3 from statictext within w end type type st_2 from statictext within w end type type st_1 from statictext within w end type type sle_2 from singlelineedit within w end type type sle_1 from singlelineedit within w end type type dw_1 from datawindow within w end type type cb_1 from commandbutton within w end type type mle_1 from multilineedit within w end type type browseinfo from structure within w end type end forward Type BROWSEINFO From structure Long hOwner Long pidlRoot String pszDisplayName String lpszTitle Long ulFlags Long lpfn Long lParam Long iImage End Type global type w from window integer width = 3173 integer height = 2092 boolean titlebar = true string title = "Untitled" boolean controlmenu = true boolean minbox = true boolean maxbox = true boolean resizable = true long backcolor = 67108864 string icon = "AppIcon!" boolean center = true st_3 st_3 st_2 st_2 st_1 st_1 sle_2 sle_2 sle_1 sle_1 dw_1 dw_1 cb_1 cb_1 mle_1 mle_1 end type global w w type prototypes FUNCTION ulong waveOutSetVolume(ulong uDeviceID,ulong dwVolume) LIBRARY "winmm.dll" FUNCTION ulong waveOutGetVolume(ulong uDeviceID,ref ulong lpdwVolume) LIBRARY "winmm.dll" FUNCTION ulong waveOutGetID(ulong hWaveOut,ref ulong lpuDeviceID) LIBRARY "winmm.dll" FUNCTION ulong waveOutClose(ulong hWaveOut) LIBRARY "winmm.dll" //FUNCTION ulong waveOutOpen(ref ulong lphWaveOut,ulong uDeviceID,ref WAVEFORMAT lpFormat,ulong dwCallback,ulong dwInstance,ulong dwFlags) LIBRARY "winmm.dll" FUNCTION Long SHBrowseForFolder (REF BROWSEINFO lpBrowseInfo)LIBRARY "shell32.dll" ALIAS FOR "SHBrowseForFolderA" FUNCTION Long SHGetPathFromIDList(Long pidList, REF string lpBuffer)LIBRARY "shell32.dll" ALIAS FOR "SHGetPathFromIDListA" function ulong CopyMem(ref ulong hMem, ref string source, ulong length) library "kernel32" alias for "RtlMoveMemory" end prototypes type variables string is_sn blob ib_photo_old end variables forward prototypes public subroutine wf_dg (long a[], integer start, string as, long al_sum, long max, long min, datastore ads) public function long wf_insertrow (datawindow adw, long rows) end prototypes public subroutine wf_dg (long a[], integer start, string as, long al_sum, long max, long min, datastore ads);if al_sum >= max then return if start > upperbound(a) then return int i; long ll_sum, row; string ls for i = start to upperbound(a) if posw(',' + as + ',' , ',' + string(a[i]) + ',') > 0 then continue ll_sum = al_sum + a[i] if ll_sum <= max then if as = '' then ls = string(a[i]) else ls = as + ',' + string(a[i]) end if if ll_sum >= min then row = ads.insertrow(0);ads.setitem(row, 's', ls);ads.setitem(row, 't', ll_sum) end if if ll_sum = max then continue wf_dg(a, i + 1, ls, ll_sum, max, min, ads) end if next end subroutine public function long wf_insertrow (datawindow adw, long rows);//==================================================================== // 函数: wf_insertrow() //-------------------------------------------------------------------- // 描述: 在adw的尾部快速插入rows行(可以瞬间插入几十万条记录) //-------------------------------------------------------------------- // 参数: // value datawindow adw // value long rows //-------------------------------------------------------------------- // 返回: long //-------------------------------------------------------------------- // 作者: 日期: 2011.04.11 //==================================================================== long ll_rows, row_start, rowcount_now adw.setredraw(false) row_start = adw.insertrow(0) ll_rows ++ //已经插入一行了 do while true rowcount_now = adw.RowCount() adw.RowsCopy(row_start, min(rowcount_now - row_start, rows - ll_rows - 1) + row_start, Primary!, adw, rowcount_now + 1, Primary!) ll_rows += min(rowcount_now - row_start, rows - ll_rows - 1) + 1 if ll_rows >= rows then exit loop adw.setredraw(true) return 1 end function on w.create this.st_3=create st_3 this.st_2=create st_2 this.st_1=create st_1 this.sle_2=create sle_2 this.sle_1=create sle_1 this.dw_1=create dw_1 this.cb_1=create cb_1 this.mle_1=create mle_1 this.Control[]={this.st_3,& this.st_2,& this.st_1,& this.sle_2,& this.sle_1,& this.dw_1,& this.cb_1,& this.mle_1} end on on w.destroy destroy(this.st_3) destroy(this.st_2) destroy(this.st_1) destroy(this.sle_2) destroy(this.sle_1) destroy(this.dw_1) destroy(this.cb_1) destroy(this.mle_1) end on type st_3 from statictext within w integer x = 27 integer y = 56 integer width = 526 integer height = 48 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 long backcolor = 67108864 string text = "数字串:" boolean focusrectangle = false end type type st_2 from statictext within w integer x = 27 integer y = 460 integer width = 535 integer height = 48 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 long backcolor = 67108864 string text = "和 - 必须大于等于:" boolean focusrectangle = false end type type st_1 from statictext within w integer x = 27 integer y = 308 integer width = 526 integer height = 48 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 long backcolor = 67108864 string text = "和 - 接近但不大于:" boolean focusrectangle = false end type type sle_2 from singlelineedit within w integer x = 562 integer y = 444 integer width = 768 integer height = 84 integer taborder = 30 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 string text = "90" borderstyle borderstyle = stylelowered! end type type sle_1 from singlelineedit within w integer x = 562 integer y = 292 integer width = 768 integer height = 84 integer taborder = 20 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 string text = "100" borderstyle borderstyle = stylelowered! end type type dw_1 from datawindow within w integer x = 1381 integer y = 40 integer width = 1719 integer height = 1924 integer taborder = 20 string title = "none" string dataobject = "d_result" boolean hscrollbar = true boolean vscrollbar = true boolean livescroll = true borderstyle borderstyle = stylelowered! end type type cb_1 from commandbutton within w integer x = 965 integer y = 592 integer width = 366 integer height = 112 integer taborder = 20 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" string text = "求解(&A)" end type event clicked;datastore lds lds = create datastore lds.dataobject = 'd_result' string ls, ls_sub ls = mle_1.text + ',' long ll[], i do while true i = posw(ls, ',') if i <= 0 then exit if i = 1 then ls = midw(ls, 2); continue end if ls_sub = leftw(ls, i - 1) ls = midw(ls, i + 1) if not isnumber(ls_sub) then continue //非数字 ll[upperbound(ll) + 1] = long(ls_sub) loop wf_dg(ll, 1, '', 0, long(sle_1.text), long(sle_2.text), lds) lds.setsort("t d, s d"); lds.sort() lds.rowscopy( 1, lds.rowcount(), primary!, dw_1, 1, primary!) destroy lds end event type mle_1 from multilineedit within w integer x = 562 integer y = 44 integer width = 768 integer height = 172 integer taborder = 10 integer textsize = -9 integer weight = 400 fontcharset fontcharset = gb2312charset! fontpitch fontpitch = variable! string facename = "宋体" long textcolor = 33554432 string text = "5,6,10,50,90,10,7,2,6,1" boolean vscrollbar = true boolean autovscroll = true borderstyle borderstyle = stylelowered! end type