(洛谷)题目题号P1616 疯狂的采药

Hello 大家好哇我是小亦今天我们在采药的基础上再看另一道题“疯狂的采药”,这道题呢非常简单难度为普及-(为洛谷难度分化)话不多说看思路:

这道题的问题是一个完全背包问题,因为每种草药可以无限制地采摘。在完全背包问题中,我们希望最大化在给定时间内可以采摘的草药的总价值。

动态规划数组dp[i]表示在i时间内能够获得的最大价值。我们遍历每种草药,对于每种草药,我们尝试将其多次加入到当前的采摘方案中,只要这样做不会超过时间限制。已下是我的参考代码均为AC状态贴代码

#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;
}


另外在这个代码中,我们首先读取总时间和草药种类数,然后读取每种草药的采摘时间和价值。接着,我们使用一个双层循环来更新动态规划数组dp。外层循环遍历每种草药,内层循环从后向前遍历动态规划数组,这样可以确保每种草药只被计算一次。最后,我们输出dp[t],即为在规定的时间内,可以采到的草药的最大总价值。讲完了下次见求关注嘿嘿

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值