题目传送门
分析:
完全背包问题,此题有一句重要的话:The value of a bond is always a multiple of $1 000.因此我们算完全背包的时候,可以把总的钱除于1000,把每种债券的价格也除于1000,这样可以减少时间。不然会超时!然后对每一年进行累加后做完全背包即可,注意数组开的太小也会re或则wa掉!
ac代码:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1000*50+5; //注意是50倍!
int d[maxn];
struct bond
{
int m,v;
}a[15];
int main()
{
//freopen("in.txt","r",stdin);
int cas;
scanf("%d",&cas);
while(cas--)
{
int m,t;
scanf("%d%d",&m,&t);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&a[i].m,&a[i].v);
a[i].m/=1000;
}
memset(d,0,sizeof(d));
for(int i=1;i<=t;i++)
{
if(i>1)
m=m+d[m/1000];
memset(d,0,sizeof(d));
for(int j=1;j<=n;j++)
{
for(int k=a[j].m;k<=m/1000;k++)
{
d[k]=max(d[k],d[k-a[j].m]+a[j].v);
}
}
}
m=m+d[m/1000];
printf("%d\n",m);
}
}