回 帖 发 新 帖 刷新版面

主题:[讨论]求助!2010年合肥市考题 twins,50分!

3. 双胞胎的烦恼(twins.bas/ twins.pas/ twins.c)
【问题描述】
有一对双胞胎(哥哥和妹妹),关系特别好,什么事都相互谦让。唯独每年到他们生日的那天,他们就会或多或少的有一些不愉快,渐渐的,成了他们的烦恼。
事情是这样的。每年到他们过生日的时候,亲朋好友都会给他们送来礼物,表示祝贺。有的人给他们买同样的礼物,有的人买不一样的礼物。每件礼物都有相应的价值。送礼物的人都没有明确说哪个礼物给谁,作为两个双胞胎,他们都希望自己收到的礼物价值高些。这不,今年生日所有的朋友送的礼物都是2本书(可能是希望他们好好读书吧),一本给哥哥,一本给妹妹。为了减少矛盾,双胞胎的妈妈让你来帮忙分配,要求使得两人所获得书本的价值和之间的差距尽可能的小(差距越小,双胞胎之间的不愉快程度越低)。
例如,有4个人送礼物,每个人的礼物价值(两个数)用一对括号括起来表示,如:(3,5),(7,11),(8,8),(2,9),可以把3,7,8,2分配给妹妹,其余的给哥哥,价值差为:5+11+8+9-3-7-8-2=13;也可以把3,7,8,9给妹妹,其余的给哥哥,价值差为:3+7+8+9-5-11-8-2=1,这是最好的方案。
【输入文件】
第一行包含一个整数N(1≤N≤30),表示礼物的数量,接下来N行,每行两个整数,表示每份礼物两本书的价值(价值范围在1到30之间)。
【输出文件】
输出一个非负整数,表示最小的价值差。
【样例输入】
4
3 5
7 11
8 8
2 9
【样例输出】
1
 
 
 
 
就是这道题,我做不出来,求助,50 分!最好有思路!

回复列表 (共8个回复)

沙发

二选一
不就演变成了二进制了吗?

循环,2的(人数)次方
余0,选第一份礼物
余1,选第二份礼物

保存最小差。


总是感觉这样的题目没意思,一点实际意义都没有,完全可以换一个题材的。


Sub moz()
Open "K:\1.txt" For Input As #1
Input #1, a%
Do Until EOF(1)
    Input #1, a%, b%
    c$ = addtolist$(Abs(a% - b%), c$)
Loop
Close #1
Do While Len(c$) > 10
    c$ = addtolist$(Abs(Val(Mid$(c$, 1, 5)) - Val(Mid$(c$, 6, 5))), Mid$(c$, 11))
Loop
Debug.Print Abs(Val(Mid$(c$, 1, 5)) - Val(Mid$(c$, 6, 5)))
End Sub
Function addtolist$(x%, y$)
If x% = 0 Then
    addtolist$ = y$
    Exit Function
End If
    z$ = Right$("     " + Str$(x%), 5)
If y$ = "" Then
    addtolist$ = z$
Else
    For i% = 1 To Len(y$) Step 5
        If z$ > Mid$(y$, i%) Then
            addtolist$ = Left$(y$, i% - 1) + z$ + Mid$(y$, i%)
            Exit Function
        End If
    Next
    addtolist$ = y$ + z$
End If
End Function

一架波音747改装成货机,机舱被限制为只能装载单列ALF连体集装箱(由两个单只箱体合并成一个连体箱,中间有隔板),但装载的左右方向可以调换,每个箱内货物实重均有标示,请计算出最小的重心差。
(其实也不切实际,但可以忽弄非专业人士,像原题那样的事情,简直笑掉人大牙。)
[img]http://cargo.koreanair.com/img/chn/iimages/cargocampus_m3pic04.gif[/img]

板凳

错了吧,好像用文件输入输出法没输出。
注:我已经改过了,还是不行。

3 楼

麻烦你把程序改成标准文字输入输出的给我行吗?

4 楼

还有,能不能把程序改成没子程序和过程的?

5 楼

moz的做法看上去是有点繁琐,但是很有条理,只是会让新手犯晕。。。。。

6 楼

DIM f(1000) AS INTEGER
DIM cost(30) AS INTEGER
INPUT lines
sum = 0
FOR i = 1 TO lines
    INPUT a, b
    cost(i) = ABS(a - b) * 2
    sum = sum + cost(i)
NEXT
half = sum / 2
FOR i = 1 TO lines
    c = cost(i)
    FOR v = half TO c STEP -1
        lv = f(v - c) + c
        IF (f(v) < lv) THEN f(v) = lv
    NEXT
NEXT
PRINT half - f(half)

7 楼

6楼的程序很精彩,看了很久才明白,高手就是高手。

8 楼

非常感谢!

我来回复

您尚未登录,请登录后再回复。点此登录或注册