【洛谷】采药(01背包问题)

cpp 复制代码
#include<iostream>
using namespace std;
int dp[105][1005] = { 0 };
int times[105] = { 0 };
int val[105] = { 0 };

int main()
{
	int T, M;
	cin >> T >> M;
	for (int i = 1; i <= M; i++)
		cin >> times[i] >> val[i];
	for (int i = 1; i <= M; i++)
	{
		for (int j = 1; j <= T; j++)
		{
			if (times[i] > j)
				dp[i][j]=dp[i - 1][j];
			//意为如果摘第 i 颗药草所需时间大于所剩时间,
			//那么就不摘,不摘的情况相当于下面公式中,逗号右边部分为0
			//故dp[i][j]取逗号左边
			else
				dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - times[i]] + val[i]);
			//如果所剩时间足够摘这株药草,
			//那么分为摘和不摘两种情况(左边不摘,右边摘),取其中价值大的一种
		}
	}
	cout << dp[M][T];
	return 0;
}

将二维数组优化为一维数组

在上面的过程中,我们发现dp[i][j] = max(dp[i - 1][j], dp[i - 1][ j - times[i] ] + val[i]);

也就是第 i 行的数据只与第 i-1 行的数据有关,因此我们存储的 i-2 ,i-3 等都是无效的数据,那么我们可以将二维数组优化成一维数组,利用一维数组里原本存储的第 i-1 行的数据,我们可以推算出第 i 行的数据,依次类推可以一直算到题目要求的 M 行。

再观察可知,某一行第 j 列的数据只与上一行的 j-1~0 列的数据有关(由dp[i - 1][ j - times[i] ]得)

那么我们得到了第 i-1 行的数据,计算第 i 行数据的时候,必须避免覆盖掉前面 j-1 列的数据,否则得不出正确答案。为了实现这一要求,我们对一维数组遍历的时候要从后往前遍历,这样对于每个元素dp[i][ j]而言,前 j-1 列的数据均被保留,那么dp[i - 1][j]和dp[i - 1][ j - times[i] ] + val[i]都能计算出来,就可以计算dp[i][ j]。

cpp 复制代码
#include<iostream>
using namespace std;
int dp[1005] = { 0 };
int times[105] = { 0 };
int val[105] = { 0 };

int main()
{
	int T, M;
	cin >> T >> M;
	for (int i = 1; i <= M; ++i)
		cin >> times[i] >> val[i];
	for (int i = 1; i <= M; ++i)
	{
		for (int j = T; j >= 1; --j)
		{
			if (times[i] <= j)
				dp[j] = max(dp[j], dp[j - times[i]] + val[i]);
		}
	}
	cout << dp[T];
	return 0;
}
相关推荐
IT从业者张某某8 分钟前
机器学习-04-分类算法-03KNN算法案例
算法·机器学习·分类
予安灵9 分钟前
第十二届蓝桥杯省赛软件类(c&c++组)
c语言·c++·蓝桥杯
chen_song_11 分钟前
WebRTC的ICE之TURN协议的交互流程中继转发Relay媒体数据的turnserver的测试
算法·音视频·webrtc·交互·媒体
蒙奇D索大27 分钟前
【数据结构】图解图论:度、路径、连通性,五大概念一网打尽
数据结构·考研·算法·图论·改行学it
uhakadotcom31 分钟前
2025年春招:如何使用DeepSeek + 豆包优化简历,轻松敲开心仪公司的大门
算法·面试·github
小白狮ww35 分钟前
Retinex 算法 + MATLAB 软件,高效率完成图像去雾处理
开发语言·人工智能·算法·matlab·自然语言处理·图像识别·去雾处理
444A4E2 小时前
C++模板:泛型编程的魔法手册,从入门到“魔改”
c++·编译原理
trust Tomorrow2 小时前
每日一题-力扣-2278. 字母在字符串中的百分比 0331
算法·leetcode
Chiyamin2 小时前
C++面向对象速览(三)
c++
Tadecanlan2 小时前
[C++面试] 智能指针面试点(重点)续4
开发语言·c++·面试