回 帖 发 新 帖 刷新版面

主题:方联邮票面值设计的难题

方联邮票面值设计的难题
如果有一組2*n的郵票,每张邮票面值可自訂。若要使這組邮票能支付1--R的邮资,且郵票不得分開。R最高為多少? 
範例1: 
1    2
4  6
能支付1--13的邮资。
範例2: 
1    2   15
4  6    8
能支付1--36的邮资。

回复列表 (共18个回复)

沙发

[quote]R最高為多少?[/quote]
R最高可以到无限大,
每张邮票均为1

板凳

1. 我觉得这样的题目没什么意义
2. 当n偏大的时候会产生极大的时间消耗在排列组合的处理上

3 楼


此题极富挑战性,需细心品味!
下面转引日前一位网友的帖,供参考:

如果有一組2*2的郵票,上面的票額可自訂(可以4張不同票額)。
若要使這組郵票能支付1~N的票額,且郵票不得分開。N最高為多少? 如果每組改成2*3呢? 

範例: 
13 
42 
上面就可為一組 
1=1 
2=2 
3=3 
4=4 
5=2+3 
6=2+4 
7=1+2+4 (不可為4+3,因為這兩張是分開的) 
8=1+3+4 
9=4+3+2 
10=1+2+3+4 

所以這组郵票可支付1~10的票額 

12
54
 
1=1
2=2
3=1+2
4=4
5=5
6=2+4
7=1+2+4
8=5+1+2
9=5+4
10=1+5+4
11=5+4+2
12=1+2+5+4
 
1~12
-----------
12
46
 
1=1
2=2
3=1+2
4=4
5=4+1
6=6
7=2+1+4
8=2+6
9=1+2+6
10=6+4
11=1+4+6
12=2+6+4
13=1+2+4+6
 
1~13(小弟測試目前極值)

4 楼

凭你这想法,你去画图慢慢算吧.

首先说说判断的事情
n为条件,R为极值
(1),(2)
(3),(4)
(5),(6)
(7),(8)
组合有多少个你知道吗?
怎么处理组合你能做到吗?
举例: 13578,13568
特点: 不能交叉选,不能跳行选
(一两次的组合不能体现有多复杂,当n越来越大时,你能估计耗掉多少运算时间吗?)

这2*n个数里,最大值应该不会越过 2^(n-1)
但具体选哪些数值进去,这些组合有多少你知道怎么选吗?
当n越来越大时,估计你的耐性有限.

这么说,这题就不用做了?
非也.
应该用数学方法来考虑,可以跳过很多步骤.
这些题目可能会有"很有技巧"的解法,
但我认为,这些题目没有一点现实意义,
纯粹取巧,与其花大量工夫和心思在解这些没有意义的题目上,
不如把精力放在扎实基础,对你学习有帮助有铺垫的方面去.

5 楼


有趣的邮票方联

1     2     15     23     38     107  
4     6      8     23     69     107  

在上表中,如果取前2,3,...,6列,所构成的2*2, 2*3, ..., 2*6的邮票方联都将具有同一特性:

每組邮票能支付1--R的邮资(满足邮票不得分開的要求),且其中R恰好是该组邮票面值的总和,即


R= 13, 36, 82, 189, 403

6 楼

嗯,挺有技术性.不知道代码要怎么写

7 楼


感谢 moz 对本帖的关注!

1. 对本题的分析与求解,可参考相关问题:“邮票面值设计”(NOIP1999 T4)
   或“连续邮资问题”(王晓东:《算法设计与分析》第5章 5.12)

2. 本题的一个难点在于:如何有效地表示所有满足“邮票彼此不得分开”的
   组合。借助4-进制的n位数,再附加适当的约束条件,便可以表示出2*n方联
   所有满足上述要求的组合。例如2*4方联

     1   2  15  23       ■■■□
     4   6   8  23       □□■■

   数(1132)表示的组合如上图所示,满足“邮票彼此不得分开”的要求,
   对应的邮资是:1+2+(15+8)+23=49。
   
   数(1320)和(0132)分别给出邮资1+(2+6)+8=17和2+(15+8)+23=48;
   而数(1032)和数(1123)则不满足“邮票彼此不得分开”的要求,
   前者含有数字0的位不在首尾,后者含有数字1和2的两位彼此相邻。
  
   对于2*2情况,满足“邮票彼此不得分开”的组合总数为13种,包括:
   (01),(02),(03),
   (10),(11),(13),
   (20),(22),(23),
   (30),(31),(32),(33)

   对于2*3情况,满足“邮票彼此不得分开”的组合总数为40种,......

8 楼

其实程序我一早已经做出来了,
但我没办法从组合中筛选出快捷的路径,
如果按穷举的方式来计算,
n=3的时候也得算上半天.

DECLARE SUB printi ()
DECLARE FUNCTION adds$ (a&, e$)
DECLARE FUNCTION count& ()
DECLARE FUNCTION space5$ (x&)
DECLARE FUNCTION summ$ (x&)
DEFLNG A-Z
DIM SHARED n, m, max
CLS
n = 3
m = n * 2
DIM SHARED s(m), z$(m)
max = 2 ^ (m - 1)

FOR i = 1 TO m
    s(i) = 1
NEXT

  DO
    i = 0
    DO
       IF s(i) > m THEN
          ms = s(i)
          s(i) = 1
       END IF
       i = i + 1
       IF i > m THEN EXIT DO
       s(i) = s(i) + 1
       z$(i) = ""
       IF i MOD 2 = 1 THEN z$(i + 1) = ""
    LOOP WHILE s(i) > max     '关键加快速度的地方
    'printi
    'a$ = INPUT$(1)
    max1 = count
    IF max1 > max2 THEN
       max2 = max1
       printi
       PRINT max2
    END IF
  LOOP UNTIL i > m

FUNCTION adds$ (a, e$)
d$ = space5$(a)
FOR i = 1 TO LEN(e$) STEP 5
    b$ = space5$(VAL(MID$(e$, i, 5)) + a)
    IF INSTR(d$, b$) = 0 THEN d$ = d$ + b$
NEXT
adds$ = d$
END FUNCTION

FUNCTION count
FOR j = m TO 1 STEP -1
    k$ = summ$(j)
    FOR i = 1 TO LEN(k$) STEP 5
        f = VAL(MID$(k$, i, 5))
        IF LEN(a$) < f + 1 THEN a$ = a$ + SPACE$(f)
        MID$(a$, VAL(MID$(k$, i, 5)), 1) = "1"
    NEXT
NEXT
count = INSTR(a$, " ") - 1
END FUNCTION

SUB printi
       LOCATE 1, 1
       FOR y = 1 TO m
           PRINT s(y),
           IF y MOD 2 = 0 THEN PRINT
       NEXT
END SUB

FUNCTION space5$ (x)
DIM y AS STRING * 5
y = LTRIM$(STR$(x))
space5$ = y
END FUNCTION

FUNCTION summ$ (x)
IF x < 1 OR x > m THEN EXIT FUNCTION
IF z$(x) = "" THEN
      IF x MOD 2 = 1 THEN p1 = x + 1 ELSE p1 = x - 1
      z$(x) = adds$(s(x), summ$(x + 2)) + adds$(s(x) + s(p1), summ$(p1 + 2) + summ$(x + 2))
END IF
   summ$ = z$(x)
END FUNCTION

9 楼


    面值为1的邮票是必需的,可以固定(其位置则是任意的);
此后每加进一种面值都要把当前所能取得的金额记录下来,通
过2n-1次的添加得到一种方案,穷举所有的方案得到最优解。
这就是算法的基本框架。

    另外,搜索一种邮票面值的起讫点也要注意,应当是从上
一个面值加1直到当前连续取得的最大金额加1。在这个范围之
外的解都可以不予考虑:过大导致不连续;小于前一面值时可
将前后面值交换,仍得到增序。

    n=2 时有2个不同的解:

        1     2     和     1    3
        4     6            7    2

10 楼

穷举?
我已经用了四个方法的提前跳出了,
还是很耗时间.
哪个始?哪个止?

我的条件是:
1. 某一个数, 必须比其他小于它的数的和大1以内
2. 总和,不能小于或等于上一次的最大总额
3. 不能出现三个相同的数字
4. 某一位置的数,不能大于2^(位置)

我来回复

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