题目
关键字:兼职问题
小明需要通过做兼职挣钱,他一天有k点体力,每连续做一次兼职都会消耗1点体力;
现在有n份兼职,按照时间排序,且互不交叉,给定n份兼职的薪水,小明可以每次挑选m份连续的兼职做;
问他一天得到的最大薪水?
分析
寻找k次 最大字段和(m个)问题!
程序设计
#include <iostream>
#include <cstdlib>
#include <vector>
using namespace std;
int MaxPay(vector<int> &p, int n, int m, int k)
{
int maxPay = 0;
if (m*k >= n)
{
int ret = 0;
for (int i = 0; i < k; i++)
ret += p[i];
return ret;
}
//选过的兼职不可再选
int flag = -1;
//k次连续m兼职最大费用
vector<int> v;
//挑选k次
int c = 0;
while (c < k)
{
maxPay = 0;
int l = 0;
for (int i = 0; i < n - m + 1 ; i++)
{
//每次挑选m个时间连续的兼职
int sum = 0;
for (int j = i; p[i] != flag && j < i + m; j++)
{
sum += p[j];
}//for
if (sum > maxPay)
{
maxPay = sum;
l = i;
}//if
}//for
v.push_back(maxPay);
for (int j = l; j < l + m; j++)
{
p[j] = flag;
}//for
c++;
}//while
int ret = 0;
for (int i = 0; i < k; i++)
ret += v[i];
return ret;
}
int main()
{
int n, m, k;
cin >> n >> m >> k;
vector<int> v;
for (int i = 0; i < n; i++)
{
int temp;
cin >> temp;
v.push_back(temp);
}//for
cout << MaxPay(v, n, m, k) << endl;
system("pause");
return 0;
}
注:题目是听朋友描述,记录下来,日后参考!