http://poj.org/gotoproblem?pid=2063 

(1)上限 m 一直上升的 n 次01背包问题,比一般的01背包多了一重循环;

(2)本题出现了各种错误:1)刚开始,没注意 m 变大会影响 dp 的上限,开了个dp[1100000], RE;

               2)由于 m 的只比较大, 开了个dp[8000000],MLE(内存不够);

                                   3)改小为dp[5000000], TLE(超时);

                                   4)为什么要开这么大数组,好像是因为 m 太大了。。

              重新读题,

                  The value of a bond is always a multiple of $1 000.

              终于降下了内存,少了1000倍的无用功。

具体代码:

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=50000;
const int Inf=1<<29;
int n, m, d;
int dp[N];
int v[15], in[15];
int main()
{
    int i, j, k, t;
    while(scanf("%d", &t)!=EOF)
    {
        while(t--)
        {
            scanf("%d%d%d", &m, &n, &d);
            for(i=1;i<=d;i++) scanf("%d%d", &v[i], &in[i]), v[i]/=1000;
            int tm;
            for(i=1;i<=n;i++)
            {
                memset(dp, 0, sizeof(dp));
                tm=m/1000;
                for(j=1;j<=d;j++)
                    for(k=v[j];k<=tm;k++)
                        dp[k]=max(dp[k], dp[k-v[j]]+in[j]);
                m+=dp[tm];
            }
            printf("%d\n", m);
        }
    }
    return 0;
}