John现有h个小时的空闲时间,他打算去钓鱼。钓鱼的地方共有n个湖,所有的湖沿着一条单向路顺序排列(John每在一个湖钓完鱼后,他只能走到下一个湖继续钓),John必须从1号湖开始钓起,但是他可以在任何一个湖结束他此次钓鱼的行程。
此题以5分钟作为单位时间,John在每个湖中每5分钟钓的鱼数随时间的增长而线性递减。每个湖中头5分钟可以钓到的鱼数用fi表示,每个湖中相邻5分钟钓鱼数的减少量用di表示,John从任意一个湖走到它下一个湖的时间用ti表示。
求一种方案,使得John在有限的h小时中可以钓到尽可能多的鱼。输出具体在第i个湖花了多少时间,如果存在多个最优解,输出优先第1个,第2个..湖中花时间最多的解.
//
#include "pch.h"
#include <iostream>
using namespace std;
const int n = 4;
int h = 4;
int f[n] = {10,15,50,30};
int d[n] = {0,3,4,3};
int t[n] = {0,1,2,3};
int hh = h * 60 / 5;
int plan[n] = {0};
int best;
void g(int p,int time) {
int max;
int m = 0;
int pl[n] = { 0 };
int fish[n];
for (int i = 0; i < p; i++) {
fish[i] = f[i];
}
for (int i = 0; i < time; i++) {
max = 0;
int flag;
for (int j = 0; j < p; j++) {
if (max < fish[j]) {
max = fish[j];
flag = j;
}
}
if (max != 0) {
//cout << "第" << i << "次" << max<<endl;
//cout <<"第"<<flag+1<<"个湖"<< fish[flag] << endl;
m = m + max;
fish[flag] = fish[flag] - d[flag];
pl[flag]=pl[flag]+1;
}
if (m > best) {
best = m;
for (int i = 0; i < p; i++) {
plan[i] = pl[i];
}
}
}
}
void p() {
int time = 0;
for (int i = 1; i <= n; i++) {
time = time + t[i-1];
g(i, hh - time);
}
for (int i = 0; i < n; i++) {
cout << plan[i]*5 << ",";
}
cout << endl;
cout << "最多能钓到的鱼"<< best;
}
int main()
{
p();
}
// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单
// 入门提示:
// 1. 使用解决方案资源管理器窗口添加/管理文件
// 2. 使用团队资源管理器窗口连接到源代码管理
// 3. 使用输出窗口查看生成输出和其他消息
// 4. 使用错误列表窗口查看错误
// 5. 转到“项目”>“添加新项”以创建新的代码文件,或转到“项目”>“添加现有项”以将现有代码文件添加到项目
// 6. 将来,若要再次打开此项目,请转到“文件”>“打开”>“项目”并选择 .sln 文件