主题:方联邮票面值设计的难题
ric500
[专家分:0] 发布于 2006-09-23 15:05:00
方联邮票面值设计的难题
如果有一組2*n的郵票,每张邮票面值可自訂。若要使這組邮票能支付1--R的邮资,且郵票不得分開。R最高為多少?
範例1:
1 2
4 6
能支付1--13的邮资。
範例2:
1 2 15
4 6 8
能支付1--36的邮资。
回复列表 (共18个回复)
沙发
moz [专家分:37620] 发布于 2006-09-23 23:49:00
[quote]R最高為多少?[/quote]
R最高可以到无限大,
每张邮票均为1
板凳
moz [专家分:37620] 发布于 2006-09-24 00:36:00
1. 我觉得这样的题目没什么意义
2. 当n偏大的时候会产生极大的时间消耗在排列组合的处理上
3 楼
ric500 [专家分:0] 发布于 2006-09-24 10:38:00
此题极富挑战性,需细心品味!
下面转引日前一位网友的帖,供参考:
如果有一組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 楼
moz [专家分:37620] 发布于 2006-09-25 11:35:00
凭你这想法,你去画图慢慢算吧.
首先说说判断的事情
n为条件,R为极值
(1),(2)
(3),(4)
(5),(6)
(7),(8)
组合有多少个你知道吗?
怎么处理组合你能做到吗?
举例: 13578,13568
特点: 不能交叉选,不能跳行选
(一两次的组合不能体现有多复杂,当n越来越大时,你能估计耗掉多少运算时间吗?)
这2*n个数里,最大值应该不会越过 2^(n-1)
但具体选哪些数值进去,这些组合有多少你知道怎么选吗?
当n越来越大时,估计你的耐性有限.
这么说,这题就不用做了?
非也.
应该用数学方法来考虑,可以跳过很多步骤.
这些题目可能会有"很有技巧"的解法,
但我认为,这些题目没有一点现实意义,
纯粹取巧,与其花大量工夫和心思在解这些没有意义的题目上,
不如把精力放在扎实基础,对你学习有帮助有铺垫的方面去.
5 楼
ric500 [专家分:0] 发布于 2006-09-26 17:38:00
有趣的邮票方联
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 楼
moz [专家分:37620] 发布于 2006-09-27 08:12:00
嗯,挺有技术性.不知道代码要怎么写
7 楼
ric500 [专家分:0] 发布于 2006-09-29 10:25:00
感谢 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 楼
moz [专家分:37620] 发布于 2006-09-29 11:28:00
其实程序我一早已经做出来了,
但我没办法从组合中筛选出快捷的路径,
如果按穷举的方式来计算,
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 楼
ric500 [专家分:0] 发布于 2006-10-03 17:23:00
面值为1的邮票是必需的,可以固定(其位置则是任意的);
此后每加进一种面值都要把当前所能取得的金额记录下来,通
过2n-1次的添加得到一种方案,穷举所有的方案得到最优解。
这就是算法的基本框架。
另外,搜索一种邮票面值的起讫点也要注意,应当是从上
一个面值加1直到当前连续取得的最大金额加1。在这个范围之
外的解都可以不予考虑:过大导致不连续;小于前一面值时可
将前后面值交换,仍得到增序。
n=2 时有2个不同的解:
1 2 和 1 3
4 6 7 2
10 楼
moz [专家分:37620] 发布于 2006-10-03 21:23:00
穷举?
我已经用了四个方法的提前跳出了,
还是很耗时间.
哪个始?哪个止?
我的条件是:
1. 某一个数, 必须比其他小于它的数的和大1以内
2. 总和,不能小于或等于上一次的最大总额
3. 不能出现三个相同的数字
4. 某一位置的数,不能大于2^(位置)
我来回复