hdu1171 参考答案
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 #include
17 using namespace std;
18 const int N=51;
19 const int Max=100000;
20 int v[N];
21 int num[N];
22 int n;
23 int ans[N][Max];
24 void DP(int value)
25 {
26 memset(ans,0,sizeof(ans));
27 int t;
28 for(int i=1;i<=n;i++)
29 for(int j=1;j<=value;j++)
30 for(int k=0;k<=num[i];k++)
31 {
32 t=j-k*v[i];
33 if(t<0)
34 break;
35 if(ans[i-1][t]+k*v[i]>ans[i][j])
36 ans[i][j]=ans[i-1][t]+k*v[i];
37 }
38
39 }
40 int main()
41 {
42 int sum;
43 while(1)
44 {
45 scanf("%d",&n);
46 if(n<0)
47 break;
48 sum=0;
49 for(int i=1;i<=n;i++)
50 {
51 scanf("%d %d",&v[i],&num[i]);
52 sum+=v[i]*num[i];
53 }
54 DP(sum/2);
55 printf("%d %d\n",sum-ans[n][sum/2],ans[n][sum/2]);
56 }
57 }
hdu1171 参考答案 (2008-11-12 14:24:02由218编辑)