#include <iostream> using namespace std; int value[41], interest[41]; //1 000 000 * (1.1^40) ≈ 46 000 000 //46 000 000/1000 = 46 000 int v[46005]; int main() { int N, n; int invest, year; scanf("%d", &N); while(N--) { scanf("%d%d%d", &invest, &year, &n); for(int i = 1; i <= n; ++i) scanf("%d%d", &value[i], &interest[i]); //record记录表格的方式记录下总投资额分别为j时的最大利润 // v[j+value[i]] = max{v[j+value[i]], v[j]+interest[i]}; memset(v, 0, sizeof(v)); for(int i = 1; i <= n; ++i) for(int j = 0; j <= 46000-value[i]/1000; ++j) if(v[j] + interest[i] > v[j+value[i]/1000]) v[j+value[i]/1000] = v[j] + interest[i]; int sum = invest; for(int i = 1; i <= year; ++i) { int max = -1; for(int j = 0; j <= sum/1000; ++j) // 寻找0~sum/1000之间最大的收入 if(v[j] > max) max = v[j]; sum += max; //收入增加作为下年的总投资 } printf("%d/n", sum); } return 0; } /* //Learn: 1. 这种题型可以用record记录表的方式处理,记录下每一种可能的情形; 2. 有时占用空间太大,可以根据题意,缩小dp数组的范围(如二维变一维,为负数时加上一个base, 空间线形缩小(本题)) //result: Problem: 2063 User: xiaofengsheng Memory: 572K Time: 32MS Language: G++ Result: Accepted */