P1616 疯狂的采药

题面:
链接:https://www.luogu.com.cn/problem/solution/P1616
类型:完全背包模板
完全背包感觉也可以用普通的0/1背包去写,但是似乎时间不够?
总之这种题目的模板就是一个一维数组dp,然后空间从t[i]遍历到times,这样可以实现多个t[i]相加
这题的N要开的大些,呃,数据更新题目不变的原因(
代码:

#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;


const int N = 2e6 + 5;
ll times, m;
ll t[N], v[N];
ll dp[N];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> times >> m;
	for (int i = 1; i < 1 + m; i++)
		cin >> t[i] >> v[i];
	for(ll i=1;i<=m;i++)
	{ 
		for (ll j = t[i]; j <= times; j++)
		{
			dp[j] = max(dp[j], dp[j - t[i]] + v[i]);
		}

	}
	cout << dp[times];
	return 0;
}

posted on 2024-04-04 09:48  WHUStar  阅读(1)  评论(0编辑  收藏  举报