- ベストアンサー
合計が決まった数で、数の組み合わせを求めるには
ちょっと数学的な問題を、パソコンで解きたいと思います。 合計が決まった数で、ある数の集まりの中からその和の組み合わせを求めたいのですが、何を使ってどのようにすればよいでしょうか。 ソフトは、Excel/Access/FileMakerがあります。 回答でなくても、自分ならこうやるよ、という意見も大歓迎です。 よろしくお願いします。 (例題) {2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180}の中で総和が1949096になる数の組み合わせは?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
すべての組み合わせについて合計を計算し、与えられた数と一致するか比較するプログラムを書いちゃいます。 InternetExplorerがあれば、JavaScriptが使えるはずなので、 それで書いてみます。下記の内容のファイルをたとえば、kumi.html という名前で保存し、IEで開けば結果が表示されます。 <pre> <script> input="2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180" sum=1949096 data=new Array(20) data=input.split(",") n=data.length //一応、入力値の解釈が正しいかどうか表示してみる。 for(i=0;i<n;i++){ document.writeln(i+" "+ data[i]) } // curent_sum = Σ flag[i]*data[i] // データ数分の和を計算する。flag[i]は、0か1の値をとる。 // 配列useをいろいろなパターンで生成することですべての組み合わせを調べる。 flag=new Array(n) n_ans=0 //見つかった答えの数 ni_no_n_jou = Math.pow(2,n) //2^nとする言語が多いが、JavaScriptではMath.powを使う。 for(j=0;j<ni_no_n_jou;j++){ make_flag_array(j) //サブルーチン、下で定義されている。 cur_sum=0 for(i=0;i<n;i++){ cur_sum += flag[i]*data[i] } if(cur_sum==sum){ n_ans++; write_ans() } } function make_flag_array(j){ tmpj=j for(i=0;i<n;i++) { amari = tmpj % 2 flag[i]=amari tmpj = (tmpj - amari)/2 } } function write_ans(){ document.writeln("答え("+n_ans+"): ") for(i=0;i<n;i++){ document.write(" + "+flag[i]*data[i]) } document.writeln() } </script> </pre>
お礼
私はてっきりVBAを使った回答が来ると思っていましたが、JavaScriptとは度肝を抜かれました。 すばらしいです!有難うございました!