i番目まで、数字がランダムに並んでいます。(マイナス数値からプラス数値まで)。これらの数値の組合せで、組合せの合計値が、ある目標値になる組合せのすべてを発見して、その組合せを1からiの番号で表示したいのです。目標値は一個だけ定めます。どのような論理を組めば可能でしょうか。(この論理をエクセルソフトに組み込み計算します)。通報する回答数8気になる0質問をブックマークします。マイページでまとめて確認できます。77%(214/277)またまた「tintagel」です。まことに申し訳ありません。回答No.1は無視して下さい。質問を間違えていました。エクセルに組み込むとの前提で回答します。数学ですと理論構築が必要となりますが、コンピュータを使用するなら結果を求めることが優先されるのではないでしょうか?そこで、問題はiの大きさと繰り返しロジックをなんとかすればできるのではないでしょうか?そこで、数字はテーブルに入っていて、その要素を選択して合計の結果を検査することを考えてみました。テーブルの要素を3つとし、選択したことを1で表しますと(0,0,0)、(0,0,1)、(0,1,0)、(0,1,1)、(1,0,0)、(1,0,1)、(1,1,0)、(1,1,1)の8通りです。これって2進数ではありませんか?組み合わせは2の3乗の8です。これでiの大きさから組み合わせは2のi乗です。これが繰り返し回数です。(だだし、初期値を0なら、最終値は2のi乗より1小さくします。)後は、組み合わせは選択されているテーブルの値を加え、目標値と一致すれば出力します。そのテーブルの要素が選択されているかどうかは添え字を10進数→2進数変換してビット検査すれば良いでしょう。これで「組み合わせパターン」と「ビット検査」の繰り返しの2回で実現できるのではないでしょうか?後は変数のクリア(テーブル合計値の変数は注意)、全然選択なしを含むかで初期値が違います。それにテーブルの開始も注意して下さい。(0か1にするかによってコーディングは違います、気を付けて下さい。関連するQ&AQ特殊な引き算(エクセル2010)エクセル2010です。77%(214/277)理論構築を行うためにモデルで考えると、i=2のときで考えてみましょう。1つの数字を3とするともう1つは2になります。1つの数字が-1ならもう1つは6になります。2数の和が5になる組み合わせですから2数が正なら(1,4)、(2,3)です。1つの数が0なら(0,5)です。...続きを読む理論構築を行うためにモデルで考えると、i=2のときで考えてみましょう。1つの数字を3とするともう1つは2になります。1つの数字が-1ならもう1つは6になります。2数の和が5になる組み合わせですから2数が正なら(1,4)、(2,3)です。1つの数が0なら(0,5)です。1つの数が負なら(-1,6)、(-2,7)、・・・となります。)2つの数が負はありません。間違えないでくださいね。)理論を成立させるには何か、制限を加える必要があります。*例えば数字を正の数だけに限定する。数字の絶対値を決める。(-99から+99の範囲にするとか)しかし、エクセルで作成されるとのことですから、数に限度があります。ヘルプで確認できると思います。遅くてもいいなら無理やり解く方法もあります。目標値を5数字は3つで範囲を-10から+10とします。数字の重複ありのとき繰り返しは入れ子にしていきます。数字に重複がないとき繰り返しは入れ子にしていきます。1つ目の数字は-10から+8まで2つ目の数字は1つ目の数字より1大きい数から+9まで3つ目の数字は2つ目の数字より1大きい数から+10まで3つの数字の和が5になるものを列挙します。構文はは省略しました。33%(10/30)計算量を削る方法を考えてみました。データを最大公約数でわる。目標値もその公約数で割る。...続きを読む計算量を削る方法を考えてみました。データを最大公約数でわる。目標値もその公約数で割る。データ:(-200,5月)(100,2月)(122,3月)(200,1月)(200,7月)(300、6月),(550、4月)目標値:850がデータ:(-100、5月),(50、2月),(61、3月),(100,1月)(100,7月)(150,6月)(275、4月)目標値:425になります。2、データを偶数のグループと奇数のグループに分ける。選ぶことが分かります。この時点で調べるべき組合せが奇数グループの選び方=2通り偶数グループの選び方=15通りで合計30通りにまで減っています。ここで奇数グループの選び方の方が少ないことに注目して奇数グループの選び方をシラミ潰しに調べます。(61,3月)を選んだときと(275,4月)を選んだときの場合分けを行います。(61,3月)を選んだときは新しい目標値は425-61=364、また残りのデータは偶数グループの中から選ぶのでデータ:(-100,5月)(50,2月)(100,1月)(100,7月)(150,6月)目標値:364と言う問題に帰着できます。ここでデータの最大公約数は50、しかし目標値は50で割り切れないので解無しとなります。(225,4月)を選んだときは新しい目標値は425ー275=150、残りのデータは偶数グループの方から選ぶのでデータ:(-100,5月)(50,2月)(100,1月)(100,7月)(150,6月)目標値:150と言う問題に帰着できます。データの最大公約数50で割るとデータ:(ー2、5月)(1、2月)(2、1月)(2、7月)(3、6月)目標値:3となります。偶数グループ、奇数グループに分けると偶数グループ:(ー2、5月)(2、1月)(2、7月)奇数グループ:(1、2月)(3、6月)目標値:3となります。目標値が奇数なので、偶数グループからは偶数個、奇数グループからは奇数個データを選ぶことになります。偶数グループの選び方=3通り奇数グループの選び方=2通りとなりのこり6通り調べれば良いことになります。奇数グループの選び方の方が少ないのでこちらをシラミ潰しに調べると、(1,2月)を選んだときデータ:(ー2、5月)(2、1月)(2、7月)目標値:2となります。ここらではしょりますが答えは{(2,1月)}{(2,7月)}{(-2,5月)(2,1月)(2,7月)}の3つです。よって全体の答えとして{1月,2月,4月}{7月,2月,4月}{5月,1月,7月,2月,4月}が得られます。(3、6月)を選んだときデータ:(ー2、5月)(2、1月)(2、7月)目標値:0この問題の答えは{(ー2、5月)(2,1月)}{(-2,5月)(2,7月)}{選ばない}となります。よって答え全体の答えとして{5月,2月、6月、4月}{5月,7月、6月、4月}{6月、4月}以上より{1月,2月,4月}{7月,2月,4月}{1月,2月,4月,5月,7月}{5月,2月、6月、4月}{5月,7月、6月、4月}{6月、4月}という答えが得られます。データによってはかなりの計算時間が削れるはずです。77%(214/277)またまたまた「tintagel」です。組み合わせ回数が問題になっているようですね。打ち切り方法と新しい方法を考えました。紹介してある方法のロジック改良です。ランダムテーブルを昇順に並ます。組み合わせの合計値が目標値を超過すれば打ち切りです。(以上ではありません。ランダム数字に0がある可能性を考慮して下さい。)(降順なら未満で打ち切りです。...続きを読むまたまたまた「tintagel」です。組み合わせ回数が問題になっているようですね。打ち切り方法と新しい方法を考えました。紹介してある方法のロジック改良です。ランダムテーブルを昇順に並ます。組み合わせの合計値が目標値を超過すれば打ち切りです。(以上ではありません。ランダム数字に0がある可能性を考慮して下さい。)(降順なら未満で打ち切りです。)新たに考えた方法です。ランダムテーブルを3つに分解します。負のテーブル、0のテーブル、正のテーブルを絶対値の昇順で並べます。目標値が負の場合、負のテーブルから検査します。組み合わせの合計値の絶対値が目標値の絶対値を超過した場合、正のテーブルの方に切り替えます。組み合わせの合計値が目標値を超過した場合、負のテーブルに切り替えます。後は同様に処理を繰り返します。(目標値との比較結果を超過で合わせるため、負の場合絶対値にしています。ロジックを一本化できるでしょう。)目標値が正の場合も同様に処理をします。0の扱いは正解があれば正解に0テーブルの組み合わせです。(ランダムの中には0は1つとは限りません。)目標値が0の場合は正、負のどちらかのテーブルで始めれば良いでしょう。(ただし、0テーブルの組み合わせを忘れずにして下さい。)ランダムの数字を順番を変更した場合は並べる前と後の対応テーブルを作成し、出力の時は前の番号で出力して下さい。後、数字が小数の場合など、エクセルの限界値にも気を付けて下さい。(丸めがあると結果が正しく出力されません。ありがとうございます。当方の質問内容に不備があり、皆様にご迷惑おかけして恐縮です。今回の質問趣旨は、下記のとおりです。当方の売掛債権に対する支払いが債務者からあります。この支払い額の割り当て月を検索、特定して、その債務者の支払い該当月分を売掛帳から消去する目的です。各債務者が支払いするごとに、その債務者の過去、数ヶ月の月ごとの売掛債権のどれを消去するべきかを特定する目的です。各債務者は1ヶ月だけ、あるいは数か月分まとめて支払います。月をまたいでランダムに支払います。支払い金額、すなわち目標値は1000円から5億円、小数、ゼロ、マイナスはありません。未払い残月数、すなわち"i"は1から最大で20程度で債務者ごとにバラケます。実際の処理は、支払いの都度、その債務者の未払い残月数(i)を与えて、未払い月毎の金額をすべて組合せ、合計して書き出し、その中から、支払額に一致する組合せのものを選択します。例:債務者Aさんが850万円を支払いした。C-(4,6月)当初の質問で条件の記入不足があり、お詫び申し上げます。33%(10/30)すいません、うそつきました。偶数グループの選び方は偶数個限定ではありません。数個でも奇数個でもOKです。よって計算量は偶数グループの方では削れません。奇数グループの選び方は目標値によって偶数個か奇数個か限定できますので一応計算量は削れます。