2
を最大化を解くために、私は線形計画との最大化について学んでいますし、2つの変数(この例では銀と金)を最大化するためのアルゴリズムに遭遇してきたが、私はどのような特定のわかりませんよコードのセクションがやっている:C++アルゴリズムは線形計画に
using namespace std;
class PreciousStones {
int n;
vector<int> as;
vector<int> ag;
を以下の関数は、私が不明確だセクションです:
double maxg (double s) {
double g = 0;
for (int i=0; i<n; i++)
if (s == 0)
g += ag[i];
else if (as[i] <= s)
s -= as[i];
else {
g += (1-s/as[i])*ag[i];
s = 0;
}
return g;
}
コードの残りの部分は以下の通りです(cについてontext)、誰もがこのアルゴリズムにいくつかの関連する論文を知っている、またはこの機能に簡単な説明を提供できる場合、私は非常に感謝します
public:
double value(vector <int> silver, vector <int> gold) {
n = silver.size();
as = silver;
ag = gold;
for (int i=0; i<n; i++)
for (int j=i+1; j<n; j++)
if (as[j]*ag[i] > as[i]*ag[j]) {
swap(as[i], as[j]);
swap(ag[i], ag[j]);
}
double lo = 0;
double hi = 51*100;
double D = 1e-10;
while (lo+D < hi && lo*(1+D) < hi) {
double mid = (lo+hi)/2;
if (mid <= maxg(mid))
lo = mid;
else
hi = mid;
}
return lo;
}
};
ヒントをいただきありがとうございます。私にはSimplexアルゴリズムよりも貪欲なアルゴリズムのように見えます。 –
2つの配列 - 2つの値を持つ構造体の配列と考えてください。これらの2つの値の積でソートします。ゼロと高い値の低いバイナリ検索は、魔法の数に初期化されます。シルバーとゴールドのすべての価値を投げ捨てて、シルバーとテストの合計額を加算します。金の残余に金の出発値として金を掛け、残りの金を合計して加算する。最初に金を最大にしてから、残っている銀をすべて拾い上げると、それが何をしようとしているのかが分かります。 – Hal
大丈夫、ありがとうたくさん:)意味がある –