- 论坛徽章:
- 7
|
v3:- #!/usr/bin/ruby
- nlength = 10
- adata = [ 5, 4.7, 4.5, 4.0, 3.5, 3.2, 2.6, 2.5, 2.0, 1.9 ]
- adata.sort! {|a, b| b <=> a }
- scount = 0
- def kelect nlength, adata
- nmax, ncheck, nt, ni = nlength - adata[-1], 1, 1, -1
- arange = adata.map {|e| (0 .. nlength / e).to_a }
- aelem = arange.map {|e| ncheck *= e.size; e.size }
- astep = [1, *(1...aelem.size).map {|e| nt *= aelem[-e] }].reverse!
- acollection = []
- while (ni += 1) < ncheck
- anum = (0...aelem.size).map {|i| arange[i][ni / astep[i] % aelem[i]] }
- nsum = 0
- for i in 0...aelem.size
- nsum += adata[i] * anum[i]
- next if nsum <= nlength
- njump = (aelem[i] - anum[i]) * astep[i]
- ni += njump - 1
- break
- end
- acollection << [nsum, nlength - nsum, anum] if
- nlength >= nsum && nsum > nmax
- end
- acollection
- end
- puts "%4s%5s%7s\t" % ['', 'sum', 'rem'] << adata * ?\t
- kelect(nlength, adata).sort {|a, b| b[0] <=> a[0] }.each do |e|
- print '%03i'% scount += 1, "| %5.1f%7.2f\t" % e.shift(2), e * ?\t, ?\n
- end
复制代码 |
|