Đây là ví dụ về sự cố có thể được giải quyết bằng cách sử dụng lập trình động. Các hoạt động sau java code giải quyết vấn đề này trong thời gian O (M * N^2) thời gian nơi
M = Số các thành phố, và
N = Tổng số bệnh việ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;
}
Kỳ sẽ là (i, n) trong đó i đại diện cho thành phố thứ i và n đại diện cho số lượng bệnh viện có sẵn. Nó đại diện cho số lượng người tối đa sẽ đến thăm bất kỳ bệnh viện nào để phân bổ tốt nhất các bệnh viện n từ thành phố thứ i trở đi đến cùng. Vì vậy, câu trả lời sẽ được cho nhà nước (0, 4) cho ví dụ bạn có trong câu hỏi của bạn.
Vì vậy, tại mỗi thành phố bạn có thể đặt tối đa là
maxHospitals = n-remainingCities bệnh viện, nơi
remainingCities = totalCities-i-1.
Vì vậy, hãy bắt đầu bằng cách đặt ít nhất 1 bệnh viện tại thành phố đó lên tối đa Bệnh viện và sau đó tái phát các vấn đề phụ nhỏ hơn khác.
Số bang = O (M * N^2)
Thời gian mỗi state = O (1)
Do đó, Thời gian phức tạp = O (M * N^2)
Mỗi thành phố phải có bệnh viện? –
@NikunjBanka Tôi làm rõ vấn đề (xem: Phụ lục). – smg
Bất kỳ ràng buộc nào? tối đa bao nhiêu bệnh viện và thành phố? dân số? –