债券可以无限购买 94一个完全背包
但是计算出来 发现空间如果开成数组 绝对mle
他说xi和n都是1000倍数
就用 dp[i]表示 i*1000个空间所获得最大价值就好
有一个小优化
对于每一年重新购买的债券
可以定义一个start 和 end
表示当前年限的起始空间 和 最大空间
start就是上一个end
end就是end加上在上一个end下获得的价值
但是计算出来 发现空间如果开成数组 绝对mle
他说xi和n都是1000倍数
就用 dp[i]表示 i*1000个空间所获得最大价值就好
有一个小优化
对于每一年重新购买的债券
可以定义一个start 和 end
表示当前年限的起始空间 和 最大空间
start就是上一个end
end就是end加上在上一个end下获得的价值
就可以实现优化
#include<iostream>
#include<cstdio>
#include<cstring>
#define MAXN 50000+10
using namespace std;
int t,n,y,d;
int a[MAXN];//前i*1000空间 最大价值
int v[20];
int w[20];
int st,en;
void readdata()
{
memset(a,0,sizeof(a));
scanf("%d%d%d",&n,&y,&d);
for(int i=1;i<=d;i++)
scanf("%d%d",&v[i],&w[i]);
st=1*1000;
en=n;
}
void solve()
{
for(int i=1;i<=d;i++)
for(int j=st;j/1000<=en/1000;j+=1000)
{
if(j-v[i]<0)
continue;
a[j/1000]=max(a[j/1000],a[(j-v[i])/1000]+w[i]);
}
}
int main()
{
scanf("%d",&t);
for(int tt=1;tt<=t;tt++)
{
readdata();
for(int i=1;i<=y;i++)
{
solve();
st=en;
en=en+a[en/1000];
}
printf("%d\n",en);
}
}