Questo è un esempio di un problema che può essere risolto utilizzando la programmazione dinamica. Il java code seguente lavoro risolve questo problema in O (M * N^2) il tempo in cui
M = Numero di città, e
N = numero totale di ospedali
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;
}
Uniti saranno (i, n), dove Io rappresento la città e n rappresenta il numero di ospedali disponibili. Rappresenta il numero massimo di persone che visiterebbero un ospedale per la migliore assegnazione di n ospedali dalla città in poi alla fine. Quindi la risposta sarebbe per lo stato (0, 4) per l'esempio che hai nella tua domanda.
Così ora ad ogni città è possibile inserire un massimo di
maxHospitals = N-remainingCities ospedali, dove
remainingCities = totalCities-i-1.
Quindi iniziare collocando almeno 1 ospedale in quella città fino a max ospedali e quindi ricorrere per altri sub piccoli problemi.
Numero di stati = O (M * N^2)
Tempo per lo stato = O (1)
Pertanto, Tempo complessità = O (M * N^2)
Ogni città deve avere un ospedale? –
@NikunjBanka Ho chiarito il problema (vedi: Addendum). – smg
Eventuali vincoli? massimo quanti ospedali e città? popolazioni? –