经典的0、1背包(话说现在还不知道什么是0、1背包),还用上了滚动数组。当初最先接触背包问题时,纠结到死,现在做起来流畅多了,只能说人是会进步的啊!

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 1005
 4 int p[MAXN],w[MAXN],f[32];
 5 int main()
 6 {
 7     int T,N,G,i,j,t,ans;
 8     scanf("%d",&T);
 9     while(T--)
10     {
11         scanf("%d",&N);
12         for(i = 0; i < N; i++)
13             scanf("%d%d",&p[i],&w[i]);
14         memset(f,0,sizeof(f));
15         for(i = 0; i < N; i++)
16             for(j = 30; j >= 1; j--)
17                 if(j >= w[i] && f[j - w[i]] + p[i] > f[j])
18                     f[j] = f[j - w[i]] + p[i];
19         scanf("%d",&G);
20         ans = 0;
21         while(G--)
22         {
23             scanf("%d",&t);
24             ans += f[t];
25         }
26         printf("%d\n",ans);
27     }
28     return 0;
29 }

做这题时还遇上了一个问题,程序运行时间和数据类型有关,这题我用 long long 就会超时,用 int 就不会,求大牛解释。