多次完全背包
顺着做下来就好
#include<stdio.h>
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,dp[100001],m,y,d,i,j,k,a[11],b[11];
scanf("%d",&n);
while (n--)
{
scanf("%d%d",&m,&y);
scanf("%d",&d);
for (i=0;i<=d-1;i++)
{
scanf("%d%d",&a[i],&b[i]);
a[i]/=1000;
}
for (i=1;i<=y;i++)
{
int s=m/1000;
memset(dp,0,sizeof(dp));
for (j=0;j<=d-1;j++)
for (k=a[j];k<=s;k++)
dp[k]=max(dp[k],dp[k-a[j]]+b[j]);
m+=dp[s];
}
printf("%d\n",m);
}
}