01背包问题对于详细说明,请见:http://www.wutianqi.com/?p=539,或者,见经典的<背包九讲>! 对于此题,重点理解:当内循环是逆序时,可以保证后一个f[v]和f[v-c[i]]+w[i]是前一状态的! #include<string.h> #include<stdio.h> int f[13000]; int a[3500],b[3500]; int main() { int n,m,i,j; scanf("%d%d",&n,&m); for(i=1;i<=n;i++) { scanf("%d%d",&a[i],&b[i]); } memset(f,0,sizeof(f)); for(i=1;i<=n;i++) { for(j=m;j>=0;j--) { if(j-a[i]>=0) f[j]=f[j]>f[j-a[i]]+b[i]?f[j]:f[j-a[i]]+b[i]; else f[j]=f[j]; } } printf("%d/n",f[m]); }