http://acm.hdu.edu.cn/showproblem.php?pid=1171
基础的01背包,求出总值sum,背包体积即为sum/2
1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 using namespace std; 5 int pr[5005],bao[250010]; 6 int main() 7 { 8 int sum,i,j,k,m,n,a; 9 while(scanf("%d",&n)!=EOF) 10 { 11 if(n<=0) 12 break; 13 memset(bao,0,sizeof(bao)); 14 sum=0; 15 i=0; 16 for(j=0;j<n;j++) 17 { 18 scanf("%d%d",&a,&m); 19 while(m--) 20 { 21 pr[i++]=a; 22 sum+=a; 23 } 24 } 25 for(j=0;j<i;j++) 26 { 27 for(k=sum/2;k>=pr[j];k--) 28 { 29 bao[k]=max(bao[k],bao[k-pr[j]]+pr[j]); 30 } 31 } 32 printf("%d %d\n",sum-bao[sum/2],bao[sum/2]); 33 } 34 return 0; 35 }