[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『指定した数字に近い組合せ』(影猫)
よろしくお願いいたします。
4000という数字を基準として、
A列に、
3000
582
675
2654
863
79
など、ランダムな数字が並んでる中から、
基準の4000に近い数字になるように
組み合わせを表示できるようにしたいのですが
可能でしょうか?
よろしくお願いいたします。
< 使用 Excel:Excel2019、使用 OS:Windows10 >
遅くなったケースと、まったく同一の数値を示した方が有益じゃないですか?
・目的変数とその制約
・独立変数にかけている条件
・3つある手法のうち採用している手法
を示してもらって共通の前提のうえで検証したらどうですか?
(γ) 2021/05/16(日) 19:23
初心者なもので、ググってもわからなくて、
友達から関数でやった方がいいのではと
アドバイスいただいたので、
質問させていただきました!
(影猫) 2021/05/16(日) 19:36
現状
C1 SUMPRODUCT(A1:A13,B1:HB13)
A B
2534 1
3264 1
112 1
457 1
264 1
546 1
. .
. .
. .
と入力しています。
ソルバー内に
目的のセル C1
目標値 最大値
変数セルの変更 $A$1:$A$13
制約条件の対象 $A1$A13 = バイナリ
C1 <= 4000
という入力をしています。
申し訳ありません、
宜しくお願い致します。
(影猫) 2021/05/16(日) 20:08
A
2534
3264
112
457
264
546
Bはすべて1を入力しています。
(影猫) 2021/05/16(日) 20:09
数字は4000以下でどんな数字でもよかったので
省略した方が見やすいかなと思いました。
2534
3264
112
457
264
546
1125
545
1789
2565
3800
1985
3302
です。
今一度、よろしくお願いいたします。
(影猫) 2021/05/16(日) 20:31
こんばんは! ソールバーがなぜ?遅くなったのかはわかりませんが、、、例のnCr関数です。。。 では、、では、、
3985 =3264+457+264 3960 =112+546+3302 3959 =112+545+3302 3954 =264+1125+2565 3944 =112+457+264+546+2565 3943 =112+457+264+1125+1985 3943 =112+457+264+545+2565 3923 =2534+264+1125 3922 =3264+112+546 3921 =3264+112+545 3920 =264+546+1125+1985 3920 =264+546+545+2565 3919 =264+1125+545+1985 3917 =457+546+1125+1789 3916 =457+1125+545+1789 3913 =2534+112+457+264+546 3912 =112+3800 3912 =2534+112+457+264+545 3909 =112+457+264+546+545+1985 3889 =2534+264+546+545 以下割愛です。
Option Explicit Sub てすと() Dim x As Variant Dim v As Variant Dim n As Long Dim r As Long Dim k As Long Dim MyTimer As Single MyTimer = Timer With Sheets("Sheet1") x = .Range("A1", .Range("A" & Rows.Count).End(xlUp)).Value End With n = UBound(x, 1) r = UBound(x, 1) - 1 ReDim v(1 To Application.Combina(n, r), 1 To 2) MynCr n, r, "", x, v, k QuickSort v, 1, LBound(v, 1), UBound(v, 1) With Sheets("Sheet2") .Cells.Clear .Range("A1").Resize(k, UBound(v, 2)).Value = v End With Erase x, v MsgBox Format(Timer - MyTimer, "###0.000") End Sub Function MynCr(ByVal n As Long, ByVal r As Long, ByVal txt As String, ByVal x As Variant, ByRef v As Variant, ByRef k As Long) Dim ix As Long If r = 0 Then Else For ix = 1 To n MynCr ix - 1, r - 1, "+" & x(ix, 1) & txt, x, v, k Next End If If txt <> "" Then If Evaluate("=" & Mid$(txt, 2)) < 4000 Then k = k + 1 v(k, 1) = Evaluate("=" & Mid$(txt, 2)) v(k, 2) = " =" & Mid$(txt, 2) End If End If End Function Private Sub QuickSort(MySAry As Variant, ByVal MySKey As Long, ByVal MySLeft As Long, ByVal MySRight As Long) Dim MySMid As Double Dim i As Long, j As Long, n As Long Dim MySLBound As Long, MySUBound As Long Dim MyStmp As Variant MySLBound = LBound(MySAry, 2) MySUBound = UBound(MySAry, 2) MySMid = MySAry((MySLeft + MySRight) \ 2, MySKey) i = MySLeft j = MySRight Do Do While MySAry(i, MySKey) > MySMid i = i + 1 Loop Do While MySAry(j, MySKey) < MySMid j = j - 1 Loop If i >= j Then Exit Do For n = MySLBound To MySUBound MyStmp = MySAry(i, n) MySAry(i, n) = MySAry(j, n) MySAry(j, n) = MyStmp Next i = i + 1 j = j - 1 Loop If MySLeft < i - 1 Then QuickSort MySAry, MySKey, MySLeft, i - 1 If MySRight > j + 1 Then QuickSort MySAry, MySKey, j + 1, MySRight End Sub (SoulMan) 2021/05/16(日) 21:57
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.