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