问题描述
村里有唯一一个泥瓦匠叫Kemo,很多人需要找Kemo修房子、修灶台、造花园……等,大家可以向Kemo预约 修葺的时间和工钱。 现在情况是: 1)Kemo只有一个人,不能同时为两个雇主工作 2)Kemo只有干完一个雇主家的活才可以在接下来的一天切换到另一个雇主家里干活。未干完一份活不可以 离开,不可以为多位雇主交叉时间干活 3)Kemo如果不能在预约的时间那天应约的话,这个雇主的这份钱就挣不到了 Kemo比较聪明,他把大家的预约收集好,想让自己忙碌一阵子,赚最多的钱。现在请你为这个忙碌而又贪心的Kemo设计一个思路吧。
输入格式
输入4行: 第一行,一个数字,n,表示n个人向Kemo预约需要修葺(n<=100) 第二行,n个正数,表示这n个人所需完成修葺的时间的起始点。若时间点为8,表示第8天开始 第三行,n个正数,表示这n个人所需完成修葺的工程天数。若天数为3,表示这一工程必须维持3天完 成(所有工程都可以在第1000天内完成,即起始点+工期<=1000) 第四行,n个正数,表示这n个人能向Kemo付出的工钱,工钱以每天计
输出格式
输出:忙完这阵子,Kemo最多能挣多少钱? 例如:4个人需要找Kemo修葺,起始时间、工期和每天的工钱分别是: 1 3 8 4 3 2 3 2 5 6 10 7 则:Kemo可以获得的最大收益为:5*3+10*3+7*2 = 59
输入样例
4 1 3 8 4 3 2 3 2 5 6 10 7
输出样例
59
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int maxMoney = 0;//记录最大工钱
int money = 0;
void backTracking(vector<vector<int>>& arr,int nowTime,int index) {
int n = arr.size() - 1;
if (nowTime > arr[n][0]) {//结束条件,所有安排时间已经计算完
return;
}
for (int i = index; i <= n; i++) {
if (nowTime > arr[i][0]) continue;//剪枝
int nextTime = nowTime;
money += arr[i][1] * arr[i][2];
maxMoney = money > maxMoney ? money : maxMoney;
nextTime = arr[i][0]+arr[i][1];
backTracking(arr, nextTime, i+1);
money -= arr[i][1] * arr[i][2];
}
}
bool compare(vector<int>& a, vector<int>& b) {
return a[0] < b[0];
}
int getMaxMoney(vector<vector<int>>& arr) {
sort(arr.begin(), arr.end(), compare);
backTracking(arr, 0,0);
return maxMoney;
}
int main() {
int n;//n个人找瓦匠修缮房子
cin >> n;
//arr[i][0],arr[i][1],arr[i][2]分别表示第i个人所需完成修葺的时间的起始点,
//所需完成修葺的工程天数,每天能向Kemo付出的工钱
vector<vector<int>> arr(n, vector<int>(3));
for (int i = 0; i < n; i++) {
cin >> arr[i][0];
}
for (int i = 0; i < n; i++) {
cin >> arr[i][1];
}
for (int i = 0; i < n; i++) {
cin >> arr[i][2];
}
cout<<getMaxMoney(arr);
}