(洛谷)题目题号P1048 [NOIP2005 普及组] 采药

Hello 大家好我是小亦今天呢也是来写一篇关于(洛谷的题目)采药话不多说见思路:

这个问题是一个典型的0-1背包问题,其中每种草药可以无限制地采摘,但是每种草药的采摘时间不能超过总的可用时间。我们的目标是在不超过总时间限制的情况下,最大化采摘草药的总价值#^.^#。

在这个问题中,我们可以使用动态规划来解决。我们可以定义一个动态规划数组dp,其中dp[i]表示在i时间内能够获得的最大价值。然后,对于每种草药,我们考虑是否将其加入到当前的采摘方案中。

以下是解决这个问题的步骤:

  1. 初始化:创建一个动态规划数组dp,大小为t+1,所有元素初始化为0。

  2. 遍历:对于每种草药,遍历动态规划数组,更新能够获得的最大价值。

  3. 更新:对于每种草药,如果将其加入到当前的采摘方案中,更新dp数组。

  4. 输出dp[t]即为在规定的时间内,可以采到的草药的最大总价值。

嗯,说了那么多那我就贴代码了仅供参考代码

#include <bits/stdc++.h>
using namespace std;
const int N = 1e4+10, mt = 1e7+10;
long long t[N], m[N], a, b;
long long dp[mt];

int main () {
	cin >> a >>	b;
	for (int i = 1; i <= b; i++) {
		cin >> t[i] >> m[i];
	}
	for (int i = 1; i <= b; i++) {
		for (int j = t[i]; j <= a; j++) {
			dp[j] = max(dp[j], dp[j - t[i]] + m[i]);
		}
	}
	cout << dp[a];

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值