Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 26883 Accepted Submission(s): 9471
2 10 1 20 1 3 10 1 20 2 30 1 -1
20 10 40 40
#include<stdio.h> #include<string.h> #define MAX 100000+10 struct record { int value,have; }num[MAX]; int c1[MAX],c2[MAX]; int main() { int n,m,a,b; int i,j,k; int sum;//记录总质量 int use; while(scanf("%d",&n)!=EOF) { if(n<0) break; sum=0; memset(num,0,sizeof(num)); for(i=1;i<=n;i++) { scanf("%d%d",&num[i].value,&num[i].have); sum+=num[i].value*num[i].have; } memset(c1,0,sizeof(c1)); memset(c2,0,sizeof(c2)); c1[0]=1; for(i=num[1].value,j=1;j<=num[1].have;i+=num[1].value,j++)//初始化 { c1[i]=1; } for(i=2;i<=n;i++) { for(j=0;j<=sum/2;j++) { for(k=0,use=0;k+j<=sum/2&&use<=num[i].have;k+=num[i].value,use++) { c2[k+j]+=c1[j]; } } for(j=0;j<=sum/2;j++) { c1[j]=c2[j]; c2[j]=0; } } for(i=sum/2;i>=0;i--)//从总价值一半枚举 { if(c1[i]) { printf("%d %d\n",sum-i,i); break; } } } return 0; }
#include<stdio.h> #include<string.h> #define MAX 500000+10 int dp[MAX],value[MAX]; int max(int x,int y) { return x>y?x:y; } int main() { int n; int i,j,sum,t; int v,m; while(scanf("%d",&n)!=EOF) { if(n<0) break; sum=0;t=0; memset(value,0,sizeof(value)); for(i=1;i<=n;i++) { scanf("%d%d",&v,&m); sum+=v*m; while(m--) { value[t++]=v; } } memset(dp,0,sizeof(dp)); for(i=0;i<t;i++) { for(j=sum/2;j>=value[i];j--) { dp[j]=max(dp[j],dp[j-value[i]]+value[i]); } } printf("%d %d\n",sum-dp[sum/2],dp[sum/2]); } return 0; }