求 dpi 只会在某一年更改,之后保持固定。
如 dp[10000] 在第一年被更改,那么第二年、第三年及以后,dp[10000] 的值都不会改变。
那么就不必清空 dp 数组,下一轮循环资金数也从 上一轮的 m 开始。
代码(0pts):
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=40+10;
const int M=5e6+10;
int w[N],v[N],dp[M];
int m,s,n,cnt=1;
signed main()
{
scanf("%lld%lld%lld",&m,&s,&n);
for(int i=1;i<=n;++i)
{
scanf("%lld%lld",&w[i],&v[i]);
}
for(int i=1;i<=s;++i)
{
for(int j=1;j<=n;++j)
{
for(int k=max(cnt,w[j])
{
dp[k]=max(dp[k],dp[k-w[j]]+v[j]);
}
}
m+=dp[m];
cnt=m;
}
printf("%lld",m);
return 0;
}
可惜这样是 WA 的。
求证实或证伪,问题很 rg 不要喷谢谢qwq。