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

描述:

有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][n];
		
			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);

		}
	}

}



测试结果:



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值