【动态规划】 拔河

拔河

时间限制 : 3.000 sec 内存限制 : 32 MB

题目描述
小明班里要举行一次拔河比赛,班主任决定将所有人分为两队,每个人都必须参加。两个队伍的人数之差不能超过1,并且两个队伍的体重之和要尽可能相近,当然相同是最好的了。
输入
输入包含多组测试数据。
每组输入的第一行是一个正整数n(2<=n<=100),表示共有n个人。
接下来n行,每行输入一个整数w(1<=w<=450),表示每个人的体重。
输出
对于每组输入,分别输出两个队伍的体重之和,按升序排序。
样例输入
3
100
90
200

样例输出
190 200

这一题是一道二维费用的动态规划问题,我们可以这样转化这个问题:
将n个物品放到一个容量为n/2的背包,每个物品占一个空间,这个背包所能承受的重量是(所有物品总和)/2 ,然后求这个背包最多能放多重的物品,这样就成功转化成一个背包问题了,状态转移方程为 f[j][k]= f[j][k] || f[j-a[i]][k-1];

注意,这一题有多组测试数据,需要循环输入,代码下方附有测试数据。

#include <iostream>
#include <string.h>
using namespace std;
int f[50010][102],a[1000];
int main()
{
    int n;
    while(cin >> n)
    {
        int sum = 0;
        memset(f,0,sizeof(f));
        for(int i=1;i<=n;i++)
        {
            cin >> a[i];
            sum=sum+a[i];
        }
        f[0][0]=1;
        for(int i=1;i<=n;i++)
        {
            for(int j=sum/2;j>=a[i];j--)
            {
                for(int k=(n+1)/2;k>=1;k--)
                {
                    f[j][k] = f[j][k] || f[j-a[i]][k-1];
                }
            }
        }
        for(int i=sum/2;i>=0;i--)
            if(f[i][(n+1)/2])
            {
                cout << i << " " << sum-i << endl;
                break;
            }
    }
    return 0;
}

测试数据:

39
329
71
124
173
83
282
408
356
37
101
298
4
328
214
94
394
32
351
131
400
244
277
187
189
160
27
410
293
137
212
45
283
17
352
153
316
230
70
432
72
305
38
383
358
152
56
277
350
155
111
295
33
118
5
450
356
65
114
18
52
48
211
320
212
350
281
296
82
86
357
227
129
425
211
247
333
385
128
91
272
442
89
123
89
192
308
305
337
373
146
30
137
259
46
401
379
236
201
353
3
224
395
180
271
94
376
124
32
334
14
110
339
100
396
74
166
231
292
426
5
229
400
445
5
333
52
92
403
422
159
245
401
218
341
348
285
129
282
228
394
111
361
415
224
440
265
125
99
66
109
403
198
150
103
340
424
167
441
371
285
222
226
157
21
289
356
150
162
183
143
446
45
21
29
172
416
262
295
78
260
306
84
95
353
279
156
409
430
179
59
230
278
340
160
116
256
401
168
352
420
252
182
24
90
115
278
3
309
313
180
11
50
272
59
98
436
325
261
116
341
66
182
128
400
313
350
393
316
418
410
12
22
87
30
150
370
48
131
361
109
19
228
266
305
77
37
64
351
218
426
399
276
175
147
63
312
347
434
48
117
403
228
433
417
386
86
18
61
263
277
26
425
197
98
110
302
323
248
72
233
369
374
76
274
3
179
442
61
231
359
61
95
161
121
174
272
234
143
3
230
356
355
443
293
215
10
439
144
174
195
328
353
134
175
160
443
384
295
224
99
82
32
321
300
158
328
305
269
314
446
208
119
314
28
181
377
109
156
24
329
392
98
254
72
355
350
1
185
262
428
413
144
177
439
50
412
101
150
115
433
272
315
35
442
124
175
198
305
60
402
62
34
18
439
41
238
326
224
87
359
236
115
23
145
313
66
282
3
39
75
279
86
138
196
271
1
350
136
81
244
212
324
324
239
200
253
429
257
407
302
50
359
280
406
343
83
28
386
444
114
364
53
411
54
212
344
66
389
376
55
109
51
336
405
353
441
141
95
180
333
221
153
366
353
79
368
331
129
227
438
338
192
270
313
369
365
32
95
150
221
340
330
31
378
57
191
370
319
397
13
379
109
148
61
368
128
375
98
41
217
300
277
166
21
170
299
375
261
62
399
436
284
394
447
298
121
212
409
399
72
178
200
410
38
117
448
98
101
127
103
115
305
271
384
57
32
29
177
8
62
45
385
35
194
387
146
83
169
137
244
226
377
359
201
329
156
78
49
273
1
242
274
62
423
314
15
226
119
280
396
417
281
70
346
72
225
199
355
147
120
394
59
340
318
18
2
2
110
291
67
44
31
151
164
137
19
307
51
368
204
10
307
141
432
410
245
123
386
150
312
142
57
343
200
104
370
206
449
197
329
265
382
4
171
176
49
335
122
445
130
120
261
110
308
49
377
334
182
287
146
130
285
239
111
102
217
320
305
318
405
239
103
281
102
68
270
364
96
420
274
331
323
403
13
294
445
47
319
190
71
308
58
184
363
262
321
264
249
69
105
217
73
209
408
165
142
93
247
15
349
108
388
29
230
406
136
124
148
427
214
44
84
6
437
68
1
253
10
55
386
322
227
376
207
439
27
67
301
321
343
240
424
233
414
51
150
176
294
222
17
66
362
423
84
337
128
147
279
347
356
89
109
332
440
370
353
141
325
285
346
174
124
208
135
63
51
187
83
283
47
174
332
316
209
356
51
247
287
43
149
165
175
64
63
337
255
87
311
424
182
384
10
63
82
148
220
333
90
68
121
326
212
327
275
377
306
83
230
103
11
438
188
154
442
12
267
210
437
182
167
63
157
234
63
31
314
296
36
2
327
99
18
297
291
133
72
124
336
10
242
77
242
231
44
103
366
398
258
206
283
93
416
40
424
170
32
52
56
114
298
1
89
72
274
138
104
52
124
44
241
435
255
18
421
381
335
117
221
299
367
50
83
35
204
286
224
170
340
108
123
210
336
200
295
62
407
409
9
79
266
111
301
221
372
81
69
189
202
196
418
171
370
188
33
370
338
306
302
107
293
251
23
352
137
400
407
2
40
293
86
134
387
69
320
192
389
17
352
83
196
418
305
381
118
24
189
26
41
162
341
139
169
133
386
222
434
252
171
411
246
266
15
248
101
435
148
198
56
340
75
292
29
392
207
206
6
67
181
418
291
322
293
192
37
283
131
318
325
432
197
413
300
204
257
450
427
192
331
394
21
329
176
94
279
157
245
269
215
51
401
210
256
411
100
105
241
168
128
368
155
48
448
255
246
164
1
331
272
201
36
432
396
17
259
198
71
286
172
15
219
409
288
428
382
361
25
65
148
92
442
411
340
18
49
214
226
259
165
55
104
324
189
163
195
314
196
377
442
422
223
446
73
64
296
233
106
274
7
331
227
222
209
266
142
61
359
47
114
14
444
330
443
295
187
282
295
36
299
200
236
60
162
384
411
201
404
214
125
104
258
360
406
278
32
434
228
214
62
146
28
43
136
346
293
298
203
257
415
420
203
291
231
187
101
161
215
253
310
127
115
351
439
38
139
194

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值