HDU 1171 Big event in hdu
这题 就是 简单的 多重背包应用..本来以为可以很快地写出来;
WA了无数次就是没找出哪里错了(有太自信的缘故);
百度了半天别人的代码,对照了半小时...说实话都要吐血了....;
终于发现了哪里错了;
教训,教训啊;再简单的题目也要慢慢来,不能太自信;
1 #include<iostream> 2 #define maxn 2000000 3 int v[1005],c[1005],dp[maxn]; 4 #define max(a,b) (a>b?a:b) 5 using namespace std; 6 int main() 7 { 8 //freopen("1171.txt","r",stdin); 9 int n,i,j,sum; 10 while(~scanf("%d",&n)) 11 { 12 memset(v,0,sizeof(v)); 13 memset(c,0,sizeof(c)); 14 sum=0; 15 if(n<=0) break; 16 for(i=1;i<=n;i++) 17 { 18 scanf("%d%d",v+i,c+i); 19 sum+=v[i]*c[i]; 20 } 21 memset(dp,0,sizeof(dp)); 22 int value=sum/2; 23 for(i=1;i<=n;i++) 24 { 25 if(v[i]*c[i]>=value) 26 { 27 for(j=v[i];j<=value;j++) 28 dp[j]=max(dp[j],dp[j-v[i]]+v[i]); 29 continue; 30 } 31 int k=1; 32 while(k<c[i]) 33 { 34 for(j=value;j>=v[i]*k;j--) 35 dp[j]=max(dp[j],dp[j-k*v[i]]+k*v[i]); 36 c[i]-=k; 37 k+=k; 38 } 39 for(j=value;j>=v[i]*c[i];j--) 40 dp[j]=max(dp[j],dp[j-c[i]*v[i]]+v[i]*c[i]); 41 } 42 43 printf("%d %d\n",sum-dp[value],dp[value]); 44 } 45 return 0; 46 }