您的位置:首页 > 职场人生

2017滴滴出行面试题 n 张桌子吃饭的最大利润

2016-09-10 11:08 190 查看
描述:

有n张桌子,每张桌子都有固定容量,有m批客人来吃饭,每一批客人都有自己的消费金额,规定客人不可以拼桌子,求老板如何安排才能获得最大利润:

样例输入:

3   5           // 分别代表 n 和 m

2  4  2       // 分别代表每张桌子的容量

                               // 下面的 m 行的第一个数字表示人数,第二个表示 消费金额

1        3        

3        5

3        7

5        9

1        10

样例输出:

20

分析   :分别选 第 1,3,   5 批人可满足题意

思路,用动态规划可解决此类问题

下面我就假设 n =3,m=5来分析

每次来一批人的时候,我们就试着把人安排在三桌的某一桌

1.  当人数大于三张桌子的任何一张的容量是,忽略这一批人,因为坐不下啊。。。。。

2.  把人分别安排在三张桌子,看看那种情况下增加的利润值最大,就选择那一桌。比如说第一批人给的钱没第五批人钱多,很明显要被置换掉。比较完后,记录下是哪一张桌子然后把该桌子拥有的利润值更新

实现代码:

package DIDIS;

import java.util.Arrays;
import java.util.Scanner;

public class Main {

public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
while (in.hasNextInt()) {
int n=in.nextInt();
int m=in.nextInt();

int v[][]=new int[3]
;

for (int i = 0; i < n; i++) {
v[0][i]=in.nextInt();
}
int p[][]=new int[m][2];
for (int i = 0; i < p.length; i++) {
p[i][0]=in.nextInt();
p[i][1]=in.nextInt();
}
for (int i = 0; i <m; i++) {
int increase=0;

int maxIndex=-1;
for (int j = 0; j <n; j++) {

int add=0;
if (p[i][0]>v[0][j]) {
continue;
}

if (p[i][1]>v[2][j]) {
add=p[i][1]-v[2][j];

}

if (add>increase) {
increase=add;
maxIndex=j;
}

}
if (maxIndex!=-1) {

v[2][maxIndex]=p[i][1];
}

}
int res=0;
for (Integer i : v[2]) {
res+=i;
}
System.out.println(res);

}
}

}


测试结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: