算是完全背包入门题吧。
#include<iostream>
#define max(a,b) (a>b?a:b)
using namespace std;
const int inf=2001000;
const int year=45;
int w,n,y;
struct
{
int interest;
int w;
}bond[15];
int mat[inf];
int dp(int w)
{
w/=1000;
for(int i=1;i<=n;i++)
for(int j=bond[i].w;j<=w;j++)
{
mat[j]=max(mat[j],mat[j-bond[i].w]+bond[i].interest);
}
return mat[w];
}
int main()
{
int cases;
scanf("%d",&cases);
while(cases--)
{
memset(mat,0,sizeof(mat));
scanf("%d%d",&w,&y);
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d%d",&bond[i].w,&bond[i].interest);
bond[i].w/=1000;
}
int ans=w;
for(int i=1;i<=y;i++)
{
ans+=dp(ans);
}
printf("%d\n",ans);
}
return 0;
}