によって消費されています。各項目のサイズはs
(正の整数)です。数は、私の問題は、次のように減少させることができるメートル消費者
ステップの間、各消費者はアイテムを選択し、そのサイズを1
だけ減らすことができます。 2人の消費者が同じ商品を選ぶことはできず、商品を選択しないままにすることができます(消費者から商品への注入機能を想像してください)。
私の質問:
(すべての項目の大きさが0である)全てのアイテムを消費するneccessary最小のステップ数は何ですか?
注:この問題の複雑さについてはわかりませんが、解決策が最適でない場合は最適です。最適に近い状態で問題ありません。
例:
// First example:
// number of items
n = 4;
// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {1, 1, 2, 4};
// number of consumers
m = 3;
// the result should be 4
int result = computeMinimumNumberOfSteps(n, m, itemSizes);
// Second example:
// number of items
n = 4;
// size of each item, itemSizes[i] represents the size of item i
int[] itemSizes = {4, 9, 5, 5};
// number of consumers
m = 2;
// the result should be 13
int result = computeMinimumNumberOfSteps(n, m, itemSizes);
私のアプローチ:
私は欲張りなアプローチを使用しています。私はすべてのアイテムまで、以下のステップを繰り返すために使用される消費されています
- は
m
最大の項目選択(ソートをし、そのsize != 0
最初m
項目を選ぶ) - 1によってそれらのサイズを減らす(消費)
- 更新番号ステップ(段階++)
のこれは今私が、遅いようだ:
m
最大の項目選択(ソートをし、そのsize != 0
最初m
項目を選ぶ)- これら
m
項目のうち、最小限の値min
を見つけます。 - ステップ数(ステップ+ =分)
これはまだあまりにも遅いと思われる更新
min
によってそれらのサイズを減少させます。私のアプローチについてどう思いますか?これをさらにスピードアップする方法はありますか? また、この問題はかなり一般的なように見えますが、私の問題を軽減できる既知の問題について知っていますか?あなたが並列マシンの数P、あなたの仕事を横取りすることができます(pmtn)を持っている。すなわち、C 最大、あなたは最大メイクスパンのC 最大を最小限にしたい| pmtn |
サイズの合計をmで割った値ではありませんか? –
@MauricePerryいいえ、ステップ中にアイテムを1つ以上減らすことはできません。したがって、サイズが5のアイテムが1つしかない場合、無限の消費者が消費できる最小ステップ数は5です。 –
@AnnaVopureta、なぜ1番目の例の結果は8ですか?それは4ではありませんか?最初に[4,2,1]を消費するので、配列は[3,1,0,1]になり、[3,1,1]を消費すると[2,0,0,0]になり、次にもう2つのステップ2を消費する。 –