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
",sum-dp[value],dp[value]);
44     }
45     return 0;
46 }
原文地址:https://www.cnblogs.com/xiaoniuniu/p/3895787.html