描述:
有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);
}
}
}
测试结果: