P1616 疯狂的采药(洛谷刷题记)
题目信息
输入第一行有两个整数,分别代表总共能够用来采药的时间 t 和代表山洞里的草药的数目 m。
第 2 到第 (m + 1) 行,每行两个整数,a,b分别表示每种草药的时间和该草药的价值
m <= 1e4,t<=1e7,m*t<=1e7,ai,bi <= 1e4;
分析
完全背包,但是:极限情况下,时间乘以药草价值 1e7*1e4 = 1e11,超过了int,所以要开long long
int 约1e9,long long 约1e18
代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e4+10,M = 1e7+10;
typedef long long ll;
ll s,n;
ll f[M]={0};
ll t[N],v[N];
int main()
{
scanf("%lld%lld",&s,&n);
for(ll i=1;i<=n;i++)
scanf("%lld%lld",&t[i],&v[i]);
for(ll i=1;i<=n;i++)
for(ll j=t[i];j<=s;j++)
f[j] = max(f[j],f[j - t[i]] + v[i]);
printf("%lld\n",f[s]);
return 0;
}
原题链接 P1616疯狂的采药