証明るファウラーの資金配分アルゴリズムは正しい
-
16-09-2019 - |
質問
マルタンファウラー 持金クラス る資金配分を日常的に見られる。このルーチンを割り当て金銭によると、与えられたリストの比率が損なわれな価値を丸めた.に広がっていくようになり他の剰余価値の。
例えば、$100に割り当てられていて、時には"比"(1,1,1)が利回り($34, $33, $33).
こちらは allocate
機能:
public long[] allocate(long amount, long[] ratios) {
long total = 0;
for (int i = 0; i < ratios.length; i++) total += ratios[i];
long remainder = amount;
long[] results = new long[ratios.length];
for (int i = 0; i < results.length; i++) {
results[i] = amount * ratios[i] / total;
remainder -= results[i];
}
for (int i = 0; i < remainder; i++) {
results[i]++;
}
return results;
}
(ためにこの問いであるために、簡単に私の自由を置き換える金型long.)
それでは、どのような適切なものはどれですか。でっか自明の後に最終的のため-ループを実行します。と思いることを証明するもの機能が正しいことを十分であることを立証するには、下記の関係がtrueの最終ループ:
remainder < results.length
できることを証明す。
解決
に関する洞察については、合計残りの和の個人remaindersを計算する際に各 result[i]
.
それぞれの個別の残りの丸めた結果では最大1.があり results.length
なremainders、合計残りもの results.length
.
編集: 明らかな証拠のないシンボルであ...
他のヒント
証拠は必要ありません。
塩基量を切り捨て、単純な除算によって割り当てられます。 そう割り当て量は常に合計以下になります。
剰余が割り当てられていない金額が含まれています。これは、常に「I」よりも小さい整数になります。そこで彼は、単にお金がなくなるまで、各受信機1を提供します。
シンプル
ちょうどその
という事実を使用しますA =フロア(/ b)は* B +(%b)は
<ストライキ>私はいくつかの好奇心比率は結果の件数その後、残りの大きな原因となりますので、それは正しくないかなと思います。したがって、私はresults[i % results.length].amount++;
を示唆している。ストライキ>
編集:私は私の答えを撤回。 long型とそこには好奇心比率は浮動小数点剰余付きません。
助けにはなりません