Это пример проблемы, которая может быть решена с помощью динамического программирования. Следующие работы java code решает эту проблему в O (M * N^2) время, когда
М = Количество городов и
N = Общее количество больниц
public void run(){
arr[0] = 100;
arr[1] = 100;
arr[2] = 200;
System.out.println(minCost(0, 4));
printBestAllocation(0, 4, minCost(0, 4));
}
static HashMap<String, Integer> map = new HashMap<String, Integer>();
// prints the allocation of hospitals from the ith city onwards when there are n hospitals and the answer for this subproblem is 'ans'
static void printBestAllocation(int i, int n, int ans){
if(i>=arr.length){
return;
}
if(n<=0){
throw new RuntimeException();
}
int remainingCities = arr.length - i - 1;
for(int place=1; place<=n-remainingCities; place++){
if(arr[i] % place == 0){
int ppl = Math.max(arr[i]/place, minCost(i+1, n-place));
if(ppl == ans){
System.out.print(place + " ");
printBestAllocation(i+1, n-place, minCost(i+1, n-place));
return;
}
}else{
int ppl = Math.max(arr[i]/place + 1, minCost(i+1, n-place));
if(ppl==ans){
System.out.print(place + " ");
printBestAllocation(i+1, n-place, minCost(i+1, n-place));
return;
}
}
}
throw new RuntimeException("Buggy code. If this exception is raised");
}
// Returns the maximum number of people that will be visiting a hospital for the best allocation of n hospitals from the ith city onwards.
static int minCost(int i, int n){
if(i>=arr.length){
return 0;
}
if(n<=0){
throw new RuntimeException();
}
String s = i + " " + n;
if(map.containsKey(s)){
return map.get(s);
}
int remainingCities = arr.length - i - 1;
int best = Integer.MAX_VALUE;
for(int place=1; place<=n-remainingCities; place++){
int ppl;
if(arr[i] % place==0){
ppl = Math.max(arr[i]/place, minCost(i+1, n-place));
}else{
ppl = Math.max(arr[i]/place + 1, minCost(i+1, n-place));
}
best = Math.min(best, ppl);
}
map.put(s, best);
return best;
}
Штаты будут (я, п), где i представляет i-й город, а n представляет количество доступных больниц. Он представляет собой максимальное количество людей, которые будут посещать больницу для лучшего распределения российских больниц от i-го города до конца. Таким образом, ответ будет для состояния (0, 4) для примера, который у вас есть в вашем вопросе.
Так что теперь в каждом городе вы можете разместить максимум из
maxHospitals = п-remainingCities больницы, где
remainingCities = totalCities-я-1.
Итак, начните с размещения как минимум 1 больницы в этом городе до максимума, а затем повторите попытку для других мелких проблем.
Количество состояний = O (M * N^2)
Время на состояние = O (1)
Поэтому сложность Time = O (M * N^2)
Каждый город должна быть больница? –
@ НикуньБанка Я разъяснил проблему (см. Приложение). – smg
Любые ограничения? сколько больниц и городов? населения? –