钓鱼问题

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 文件

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值