关于问题
有n人和k种不同类型的菜肴。每个人都有 对每道菜都有一些偏好。他喜欢与否。我们要 喂所有人。每个人都应该得到他的至少一道菜 chioce。我们可以提供不同类型菜肴的最小数量 购买?
其中一个解决方案是,
public class OptimumDish {
private Set<Integer> result = new HashSet<Integer>();
public void print(){
for(int r:result)
System.out.print(r + " ");
}
// Find the optimum dish by navigating all available options
public void find(int[][] m, int r, int c, int mr, int mc, Stack<Integer> dishes) {
dishes.push(c);
if (r == mr) {
// Reached last person. Get the unique dishes
Set<Integer> d = new HashSet<>(dishes);
if(result.size() == 0 || result.size() > d.size())
result = d;
}
else if (r < mr) {
// Check next person's preferred dish
for (int i = 0; i <= mc; i++) {
if (m[r + 1][i] == 1) {
find(m, r+1, i, mr, mc, dishes);
break;
}
}
}
dishes.pop();
// Current dish may not be the optimum.
// Check other dish for the same person
for (int i = c + 1; i <= mc; i++) {
if (m[r][i] == 1) {
find(m, r, i, mr, mc, dishes);
}
}
}
public static void main(String[] args) {
int[][] m = {
{ 0, 1, 1, 0, 0, 0, 0 },
{ 0, 1, 0, 1, 0, 0, 0 },
{ 0, 1, 1, 0, 0, 1, 0 },
{ 1, 0, 0, 1, 0, 0, 0 },
{ 0, 0, 1, 0, 1, 0, 0 },
{ 0, 0, 0, 1, 0, 0, 1 }
};
int mr = m.length - 1;
int mc = m[0].length - 1;
int c = 0;
for (int i = 0; i <= mr; i++) {
if (m[0][i] == 1) {
c = i;
break;
}
}
OptimumDish od = new OptimumDish();
Stack<Integer> dishes = new Stack<>();
od.find(m, 0, c, mr, mc, dishes);
od.print();
}
}
此问题属于&#39;最小设置封面&#39;。由于它是NP完全问题,因此无法在多项式时间内求解。根据解决方案,它可以在多项式时间内求解?
请告诉我这个解决方案的时间复杂度是多少?为O(n ^ 4)+。感谢。