zoukankan      html  css  js  c++  java
  • 将一个数组分成相加结果最相近的两个数组

    分组的思想就是先把数组排序,分成两组,然后再把这两组的值相减,根据这个值再递归的进行调整,直到这个值小于任何两个相减的值。

    str =  [1,2,3,4,5,6,7,8,9,11,100]
    str = str.sort
    a = []
    b = []

    for i in 0..str.length-1
      if i%2==0
        a<<str[i]
      else
        b<<str[i]
      end
    end

    if a.length > b.length and a.inject(&:+)>b.inject(&:+)
      b<<a.min;a.delete_at(a.index(a.min))
    elsif b.length > a.length and b.inject(&:+)>a.inject(&:+)
      a<<b.min;b.delete_at(b.index(b.min))
    end

    def getSum arr
      a = arr[0]
      for i in 1..arr.length
        a = a+arr[i].to_i
      end
      a
    end

    def exchange a,b,sum1,sum2  
      flag = (sum1 - sum2).abs/2
      for i in 0..a.length-1
        temp_ = flag
        for j in 0..b.length-1  
          if a[i]>b[j]
            if flag - (a[i] - b[j]) < temp_ && flag >= (a[i] - b[j])
              temp_ = flag -a[i] + b[j]
              #p flag
              temp = a[i]
              a[i] = b[j]
              b[j] = temp
              #p a
              #p b
              ret = true
              break
            end
          end      
        end
        break if ret
      end
      return if ret == nil   
      ret = nil
      sum1 = getSum a
      sum2 = getSum b
      exchange (sum1>sum2)?(a):(b),(sum1>sum2)?(b):(a),(sum1>sum2)?(sum1):(sum2),(sum1>sum2)?(sum2):(sum1)    
    end

    def assign a,b
      sum1 = getSum a
      sum2 = getSum b
      if sum1==sum2    
        return
      else
        exchange (sum1>sum2)?(a):(b),(sum1>sum2)?(b):(a),(sum1>sum2)?(sum1):(sum2),(sum1>sum2)?(sum2):(sum1)    
      end  
    end

    assign a,b
    p a.sort
    p b.sort

  • 相关阅读:
    从客户端检测到有潜在危险的Request.Form值
    IE6,IE7,FF等浏览器不兼容原因及解决办法
    C#代码与javaScript函数的相互调用
    Asp.net 导出Excel 和Word
    JS取得RadioButtonList的Value,Text及选中值等信息
    VS2005+SQL2005 ASP.NET2.0数据库连接
    蛮好蛮使用的登陆界面
    C#.NET防止SQL注入式攻击
    Asp.net中防止用户多次登录的方法
    集合初始化器
  • 原文地址:https://www.cnblogs.com/zhangfei/p/3320412.html
Copyright © 2011-2022 走看看