いつもお世話になっております。
今回ご助力いただきたいのは、以下のアルゴリズム実装についてです。
(ここでは単純化した一例を記述しています。)
以下の数字配列(vector<int> a)があったとします。 1, 2, 2, 1, 2, 1, 1, 2, 1 また、ある数字(0~5(配列内の1の個数); int Num)があったとします。 ここでは仮に3とします。 5C0 ~ 5C5通りの組み合わせで、それぞれ配列中の数字1を4倍します。
私が考えたのは
c++
1//最初に1の場所配列と個数を取得する*1 2int Cnt = 0; 3vector<int> Pos; 4for (int i=0; i< a.size() ; i++) 5{ 6 if(a[i] == 1) 7 { 8 Cnt++; 9 Pos.push_back(i); 10 } 11} 12 13 14//Σ(i=0→Num){(Num)C(i)} = 2^Numを利用し、 15//1 ~ 2^Numまでを二進数化することで、4倍する場所を見つける*2 16long Total = pow(2, Num) 17vector<int> Bin; //二進数を1か0の数値配列と見なす 18for (int i=0; i<Total ; i++) 19{ 20 //二進数化の手法は省略 21 22 //Binが1となるjが4倍されるべきj番目の1 23 //j番目の1はPos[j]に*1で代入されている 24 for (int j=0; j<Total ; j++) 25 { 26 if(Bin[j] == 1) 27 { 28 a[Pos[j]] *= 4; 29 } 30 } 31}
うまくやれば、1と2のように二つに分けなくても
一つのループ文で出来るような気がするのですが、
どのようにネットで調べればよいのか分からなかったので
質問させていただきます。
よろしくお願いいたします。
まず「以下のアルゴリズム」が何言ってるかわかりません。
* 「ある数字」(Num)が登場しますが、他で使用されていません。
* 「5C0 ~ 5C5通りの組み合わせ」は何の組み合わせなのか
* そもそも5C0 = 5C1 = 1 なので「1 ~ 1通りの組み合わせ」となるが、どういう意味か
* 「数字1を4倍」とはなにか? 1を4に置換すること?
実装コードから察してみようとは思いますが、もう少しわかりやすく説明してください
なぜ、ループを分けてはいけないんでしょうか?(無理なんじゃないかと思いますが)
2個の場合で考えたら、00, 01, 10, 11の組み合わせになって、1つの数字は2回選択されるんですよね
だから、1を4^2で16に置き換えるだけでいい、という結果になりますが…
なお、3個なら4回、4個なら8回、5個なら16回選択され、1の部分は4^16の数になります
これ、普通のint型ならオーバーフローしてしまいます、なんかおかしいですね?
言わんとしていることは理解したものの、最終的に何を入力にして何を出力にしたいのかがソースコードを見ても明確に読みとれません(Bin空のままだし)