• ベストアンサー

合計が決まった数で、数の組み合わせを求めるには

 ちょっと数学的な問題を、パソコンで解きたいと思います。  合計が決まった数で、ある数の集まりの中からその和の組み合わせを求めたいのですが、何を使ってどのようにすればよいでしょうか。  ソフトは、Excel/Access/FileMakerがあります。  回答でなくても、自分ならこうやるよ、という意見も大歓迎です。  よろしくお願いします。 (例題) {2550,1210,90150,110223,17112,142816,87442,14650,1701413,11788,4460,24180}の中で総和が1949096になる数の組み合わせは?

質問者が選んだベストアンサー

  • ベストアンサー
  • wolv
  • ベストアンサー率37% (376/1001)
回答No.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>

参考URL:
http://tohoho.wakusei.ne.jp/js/math.htm#xMath,http://tohoho.wakusei.ne.jp/js/string.htm,http://tohoho.wakusei.ne.jp/js/o
toshihiko_ooishi
質問者

お礼

 私はてっきりVBAを使った回答が来ると思っていましたが、JavaScriptとは度肝を抜かれました。  すばらしいです!有難うございました!

関連するQ&A