【动态规划】 拔河

拔河

时间限制 : 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

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vivado是由Xilinx公司开发的一种FPGA综合工具,用于设计和实现数字逻辑电路。要实现拔河,首先需要对拔河过程进行建模设计。 在Vivado中,我们可以使用Verilog或VHDL等HDL语言对拔河设计进行描述。首先,我们需要定义参与拔河的两组队伍,每组队伍有一定数量的成员。可以使用模块实例化的方式创建队伍成员的实例。 接下来,我们需要定义一个计数器,用于记录队伍成员受力的次数。可以使用计数器模块实现计数功能。当一个队伍的成员施加力量时,计数器将增加一定的计数值。 然后,我们需要根据拔河规则,在队伍成员受力计数达到一定数值时,判断哪个队伍获胜。可以使用比较器模块来实现比较功能,当一个队伍的计数器值超过对手队伍的计数器值时,判定该队伍获胜。 最后,我们需要编写相关的约束文件,指定FPGA器件的引脚分配和约束条件,以确保设计能够正确地映射到目标器件上。 在完成设计后,可以使用Vivado进行综合、布局和布线等操作,生成丝印输出文件和位文件。丝印输出文件用于指定FPGA器件上各个器件和导线的位置,位文件用于烧录到FPGA器件中,实现拔河功能。 总之,通过Vivado的设计和综合工具,我们可以实现拔河的功能,并在FPGA器件上进行验证和运行。这不仅可以提高设计的灵活性和性能,还可以更好地理解拔河过程中力量的作用和竞争规则。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值