网页资讯视频图片知道文库贴吧地图采购
进入贴吧全吧搜索

 
 
 
日一二三四五六
       
       
       
       
       
       

签到排名:今日本吧第个签到,

本吧因你更精彩,明天继续来努力!

本吧签到人数:0

一键签到
成为超级会员,使用一键签到
一键签到
本月漏签0次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行补签。
连续签到:天  累计签到:天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
08月01日漏签0天
excel吧 关注:281,440贴子:1,551,278
  • 看贴

  • 图片

  • 吧主推荐

  • 视频

  • 游戏

  • 17回复贴,共1页
<<返回excel吧
>0< 加载中...

【求助】求特定和值的数字组合

  • 只看楼主
  • 收藏

  • 回复
  • tmxzp
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
如下图,B列基础数据,第一行是目标数字(A列是辅助列)
我需要在C~F列自动找出和值最接近目标数字的组合,且只能大于目标数字
用过C2=IF(SUM(C$2:C$29)=B$2,C$1,A2*RANDBETWEEN(0,1)),启用迭代,但是发现要经过几十次上百次的刷新,才能算出第一组结果,还不如肉眼看的快。
也尝试过用“规划求解”,但是运算出来的结果都是小数,即每个数取一点点,然后组合成目标数字,不知道是不是我的设置不对
还请大神指教一二,
感谢


  • 菠萝蜜
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
用过的数据还能用吗?


2025-08-01 14:42:39
广告
不感兴趣
开通SVIP免广告
  • 贝爷心中留
  • 日新月E
    8
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
我怎么会想到背包问题


  • 菠萝蜜
  • E览无余
    11
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

'每个数使用一次,不太可能是最优但接近于最优应该是没有问题的
'自己对结果进行分拆一下就可以了
Option Explicit
Sub abc()
 Dim a, b, i, j, k, m, t, cnt, n
 a = Range("b2:b" & [b2].End(xlDown).Row)
 b = [c1].Resize(, [c1].End(xlToRight).Column - 2).Value
 ReDim d(1 To 1, 1 To UBound(b, 2))
 Call bsort(a, 1, UBound(a, 1), 1, 1, 1)
 cnt = UBound(a)
 ReDim c(1 To 2, 1 To 2)
 For i = 1 To UBound(b, 2)
  c(1, 1) = vbNullString: c(1, 2) = 10 ^ 8
  Call combin(a, c, 0, LBound(a, 1), cnt, 0, b(1, i), vbNullString)
  d(1, i) = c(1, 1)
  t = Split(c(1, 1), "+")
  For j = 1 To UBound(t)
   For k = 1 To cnt
    If CStr(a(k, 1)) = t(j) Then a(k, 1) = vbNullString: Exit For
   Next
  Next
  For j = 1 To cnt
   If Len(a(j, 1)) Then m = m + 1: a(m, 1) = a(j, 1)
  Next
  cnt = m: m = 0
 Next
 [c2].Resize(, UBound(d, 2)) = d
End Sub
Function bsort(a, first, last, left, right, key)
 Dim i, j, k, t
 For i = first To last - 1
  For j = first To last + first - 1 - i
   If a(j, key) < a(j + 1, key) Then
    For k = left To right
     t = a(j, k): a(j, k) = a(j + 1, k): a(j + 1, k) = t
    Next
   End If
  Next
 Next
End Function
Function combin(a, b, m, n, cnt, t, sum, s)
 If t = sum Then m = m + 1: b(m, 1) = s: Exit Function
 If m = 1 Then Exit Function
 If n > cnt Then Exit Function
 If t > sum Then
  If t - sum < b(1, 2) Then b(1, 2) = t - sum: b(1, 1) = s
  Exit Function
 Else
  If sum - t < b(1, 2) Then b(1, 2) = sum - t: b(1, 1) = s
 End If
 Call combin(a, b, m, n + 1, cnt, t, sum, s)
 Call combin(a, b, m, n + 1, cnt, t + a(n, 1), sum, s & "+" & a(n, 1))
End Function


登录百度账号

扫二维码下载贴吧客户端

下载贴吧APP
看高清直播、视频!
  • 贴吧页面意见反馈
  • 违规贴吧举报反馈通道
  • 贴吧违规信息处理公示
  • 17回复贴,共1页
<<返回excel吧
分享到:
©2025 Baidu贴吧协议|隐私政策|吧主制度|意见反馈|网络谣言警示