经典的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 就不会,求大牛解释。