#include <stdio.h> #include <math.h> #include <string.h> int max(int a,int b) { return a>b?a:b; } int f[50001]; //每次增长以最大1.1倍计算,范围是(1.1)^40*1000000/1000 int c[11],w[11]; int main() { int T; scanf("%d",&T); while(T--) { int i,j,k,m,n,p,t; scanf("%d%d%d",&m,&p,&n); for(i=0;i<n;i++) scanf("%d%d",&c[i],&w[i]); for(k=0;k<p;k++) { memset(f,0,sizeof(f)); t=m/1000; //投资时1000的倍数,因而可以进行m/1000,减少时间和空间消耗 for(i=0;i<n;i++) { for(j=c[i]/1000;j<=t;j++) f[j]=max(f[j],f[j-c[i]/1000]+w[i]); } m+=f[t]; } printf("%d\n",m); } return 0; }
如果不进行/1000处理就会超时和超空间;
题目中说过每次债卷都是几千,因而可以进行/1000压缩空间需求