问题描述: 用5,7,12做加减运算,要求用最少步数得到任意数n
数学模型:
i * 5+ j * 7+k * 12=n n为任意正负整数
min(|i|+|j|+|k|)
分析:
对于-11到11,可手工算出
1 = +3 x 5 -2 x 7
2 = -1 x 5 +1 x 7
3 = +2 x 5 -1 x 7
4 = -2 x 5 +2 x 7
5 = +1 x 5 +0 x 7
6 = +4 x 5 -2 x 7
7 = 1 x 7
8 = +3 x 5 -1 x 7
9 = -1 x 5 +2 x 7
10 = +2 x 5
11 = -2 x 5 +3 x 7
...
即:
n=a*5+b*7 -11=<n=<11 (1)
对于其他整数,均可转化为12*m+x, |x|<12
12*m+x=n (2)
由式(1) and (2),得到
12*m+a*5+b*7=n (3)
由于m,a,b可以消减,要得到最小加减步数只能以如下顺序消减:
1.a,b同号时,利用5+7得到12从而消减掉5或7
2.m,a异号,则利用12-5消减得到7
3.m,b异号,则利用12-7消减得到5
消减完毕后,得到m,a,n,必须此作如下检查:
1.如果m=0,退出
2.如果m,a同号且|a|=6,则m=m-sign(a),a=0,b=b+sign(a)*5,如果|b|>12,则b=b-sign(b)*12,m=m+1
例如54=12*2+5*6,但最优解确是54=12+7*6。
python code:
#!/usr/bin/python
# coding=utf-8
# 算法:用5,7,12加减运算,求最少步数得到任意数n
# Filename test
# Date Author Comment E-mail
# 6/27/2011 Tony-Wu V1.0 sywu@sohu.com
import getopt
import os
import os.path
import re
import string
import sys
import getpass
import urllib
import subprocess
import time
import andr_util
val_0_11=(
(0,0,0),
(3, -2, 0), (-1,1,0),(1,-2,1),(-2,2,0),(1,0,0),
(4,-2,0),(0,1,0),(3,-1,0),(-1,2,0),(2,0,0),
(5,-2,0));
def PrintUsage():
'''prints usage info.
Must provide at least one argument'''
print( " usage: " + sys.argv[0] + " number")
print( " usage: " + sys.argv[0] + " min max delta")
print("")
sys.exit(1)
def parseArgument():
global g_testFolder
if len(sys.argv) > 4 or len(sys.argv)<2:
PrintUsage()
def finalCheck(i,j,k,n):
if i != 5 and i != -5:
return (i,j,k)
if i>0 and k >0:
j=j+5
k=k-1
if j>12:
j-=12
k+=7
i=0
if i<0 and k <0:
j=j-5
k=k+1
if j<-12:
j+=12
k-=7
i=0
return (i,j,k)
def getMinStep(N):
k=int(N / 12)
left=N-k*12
j=int(left/7)
left=left-j*7
i=int(left/5)
left=left-i*5
if(left < 0):
i-=val_0_11[-left][0];
j-=val_0_11[-left][1];
k-=val_0_11[-left][2];
else:
i+=val_0_11[left][0];
j+=val_0_11[left][1];
k+=val_0_11[left][2];
if(i > 0 and j > 0) or (i <0 and j<0): #Merge to 12
merge12=min(abs(i),abs(j))
if i>0:
i-=merge12
j-=merge12
k+=merge12
else:
i+=merge12
j+=merge12
k-=merge12
elif (i * k < 0):
merge7=min(abs(i),abs(k))
if i>0:
i-=merge7
j-=merge7
k+=merge7
else:
i+=merge7
j+=merge7
k-=merge7
elif (j * k < 0):
merge5=min(abs(j),abs(k))
if j>0:
i-=merge5
j-=merge5
k+=merge5
else:
i+=merge5
j+=merge5
k-=merge5
res=finalCheck(i,j,k,N)
return res #(i,j,k)
if __name__ == '__main__':
parseArgument()
if len(sys.argv) > 2:
minVal=0
maxVal=0;
delta=1;
try:
minVal=int(sys.argv[1])
maxVal=int(sys.argv[2])+1
delta=int(sys.argv[3])
except IndexError:
print("get paraemter error")
for x in range(minVal,maxVal,delta):
res=getMinStep(int(x))
print("%d \t = %+d x 5 \t %+d x 7 \t %+d x 12"%(x,res[0],res[1],res[2]))
else:
res=getMinStep(int(sys.argv[1]))
print("%d \t = %+d x 5 \t %+d x 7 \t %+d x 12"%(int(sys.argv[1]),res[0],res[1],res[2]))
执行命令:
test.py -100 100 1
计算结果:
-100 = +0 x 5 -4 x 7 -6 x 12
-99 = -3 x 5 +0 x 7 -7 x 12
-98 = +0 x 5 -2 x 7 -7 x 12
-97 = +0 x 5 -5 x 7 -5 x 12
-96 = +0 x 5 +0 x 7 -8 x 12
-95 = +0 x 5 -5 x 7 -5 x 12
-94 = -2 x 5 +0 x 7 -7 x 12
-93 = +0 x 5 -3 x 7 -6 x 12
-92 = -4 x 5 +0 x 7 -6 x 12
-91 = +0 x 5 -1 x 7 -7 x 12
-90 = -6 x 5 +0 x 7 -5 x 12
-89 = -1 x 5 +0 x 7 -7 x 12
-88 = +0 x 5 -4 x 7 -5 x 12
-87 = -3 x 5 +0 x 7 -6 x 12
-86 = +0 x 5 -2 x 7 -6 x 12
-85 = +0 x 5 -5 x 7 -4 x 12
-84 = +0 x 5 +0 x 7 -7 x 12
-83 = +0 x 5 -5 x 7 -4 x 12
-82 = -2 x 5 +0 x 7 -6 x 12
-81 = +0 x 5 -3 x 7 -5 x 12
-80 = -4 x 5 +0 x 7 -5 x 12
-79 = +0 x 5 -1 x 7 -6 x 12
-78 = -6 x 5 +0 x 7 -4 x 12
-77 = -1 x 5 +0 x 7 -6 x 12
-76 = +0 x 5 -4 x 7 -4 x 12
-75 = -3 x 5 +0 x 7 -5 x 12
-74 = +0 x 5 -2 x 7 -5 x 12
-73 = +0 x 5 -5 x 7 -3 x 12
-72 = +0 x 5 +0 x 7 -6 x 12
-71 = +0 x 5 -5 x 7 -3 x 12
-70 = -2 x 5 +0 x 7 -5 x 12
-69 = +0 x 5 -3 x 7 -4 x 12
-68 = -4 x 5 +0 x 7 -4 x 12
-67 = +0 x 5 -1 x 7 -5 x 12
-66 = -6 x 5 +0 x 7 -3 x 12
-65 = -1 x 5 +0 x 7 -5 x 12
-64 = +0 x 5 -4 x 7 -3 x 12
-63 = -3 x 5 +0 x 7 -4 x 12
-62 = +0 x 5 -2 x 7 -4 x 12
-61 = +0 x 5 -5 x 7 -2 x 12
-60 = +0 x 5 +0 x 7 -5 x 12
-59 = +0 x 5 -5 x 7 -2 x 12
-58 = -2 x 5 +0 x 7 -4 x 12
-57 = +0 x 5 -3 x 7 -3 x 12
-56 = -4 x 5 +0 x 7 -3 x 12
-55 = +0 x 5 -1 x 7 -4 x 12
-54 = -6 x 5 +0 x 7 -2 x 12
-53 = -1 x 5 +0 x 7 -4 x 12
-52 = +0 x 5 -4 x 7 -2 x 12
-51 = -3 x 5 +0 x 7 -3 x 12
-50 = +0 x 5 -2 x 7 -3 x 12
-49 = +0 x 5 -5 x 7 -1 x 12
-48 = +0 x 5 +0 x 7 -4 x 12
-47 = +0 x 5 -5 x 7 -1 x 12
-46 = -2 x 5 +0 x 7 -3 x 12
-45 = +0 x 5 -3 x 7 -2 x 12
-44 = -4 x 5 +0 x 7 -2 x 12
-43 = +0 x 5 -1 x 7 -3 x 12
-42 = -6 x 5 +0 x 7 -1 x 12
-41 = -1 x 5 +0 x 7 -3 x 12
-40 = +0 x 5 -4 x 7 -1 x 12
-39 = -3 x 5 +0 x 7 -2 x 12
-38 = +0 x 5 -2 x 7 -2 x 12
-37 = +0 x 5 -5 x 7 +0 x 12
-36 = +0 x 5 +0 x 7 -3 x 12
-35 = +0 x 5 -5 x 7 +0 x 12
-34 = -2 x 5 +0 x 7 -2 x 12
-33 = +0 x 5 -3 x 7 -1 x 12
-32 = -4 x 5 +0 x 7 -1 x 12
-31 = +0 x 5 -1 x 7 -2 x 12
-30 = -6 x 5 +0 x 7 +0 x 12
-29 = -1 x 5 +0 x 7 -2 x 12
-28 = +0 x 5 -4 x 7 +0 x 12
-27 = -3 x 5 +0 x 7 -1 x 12
-26 = +0 x 5 -2 x 7 -1 x 12
-25 = -5 x 5 +0 x 7 +0 x 12
-24 = +0 x 5 +0 x 7 -2 x 12
-23 = +1 x 5 -4 x 7 +0 x 12
-22 = -2 x 5 +0 x 7 -1 x 12
-21 = +0 x 5 -3 x 7 +0 x 12
-20 = -4 x 5 +0 x 7 +0 x 12
-19 = +0 x 5 -1 x 7 -1 x 12
-18 = -5 x 5 +1 x 7 +0 x 12
-17 = -1 x 5 +0 x 7 -1 x 12
-16 = +1 x 5 -3 x 7 +0 x 12
-15 = -3 x 5 +0 x 7 +0 x 12
-14 = +0 x 5 -2 x 7 +0 x 12
-13 = -4 x 5 +1 x 7 +0 x 12
-12 = +0 x 5 +0 x 7 -1 x 12
-11 = +2 x 5 -3 x 7 +0 x 12
-10 = -2 x 5 +0 x 7 +0 x 12
-9 = +1 x 5 -2 x 7 +0 x 12
-8 = -3 x 5 +1 x 7 +0 x 12
-7 = +0 x 5 -1 x 7 +0 x 12
-6 = -4 x 5 +2 x 7 +0 x 12
-5 = -1 x 5 +0 x 7 +0 x 12
-4 = +2 x 5 -2 x 7 +0 x 12
-3 = -2 x 5 +1 x 7 +0 x 12
-2 = +1 x 5 -1 x 7 +0 x 12
-1 = -3 x 5 +2 x 7 +0 x 12
0 = +0 x 5 +0 x 7 +0 x 12
1 = +3 x 5 -2 x 7 +0 x 12
2 = -1 x 5 +1 x 7 +0 x 12
3 = +2 x 5 -1 x 7 +0 x 12
4 = -2 x 5 +2 x 7 +0 x 12
5 = +1 x 5 +0 x 7 +0 x 12
6 = +4 x 5 -2 x 7 +0 x 12
7 = +0 x 5 +1 x 7 +0 x 12
8 = +3 x 5 -1 x 7 +0 x 12
9 = -1 x 5 +2 x 7 +0 x 12
10 = +2 x 5 +0 x 7 +0 x 12
11 = -2 x 5 +3 x 7 +0 x 12
12 = +0 x 5 +0 x 7 +1 x 12
13 = +4 x 5 -1 x 7 +0 x 12
14 = +0 x 5 +2 x 7 +0 x 12
15 = +3 x 5 +0 x 7 +0 x 12
16 = -1 x 5 +3 x 7 +0 x 12
17 = +1 x 5 +0 x 7 +1 x 12
18 = +5 x 5 -1 x 7 +0 x 12
19 = +0 x 5 +1 x 7 +1 x 12
20 = +4 x 5 +0 x 7 +0 x 12
21 = +0 x 5 +3 x 7 +0 x 12
22 = +2 x 5 +0 x 7 +1 x 12
23 = -1 x 5 +4 x 7 +0 x 12
24 = +0 x 5 +0 x 7 +2 x 12
25 = +5 x 5 +0 x 7 +0 x 12
26 = +0 x 5 +2 x 7 +1 x 12
27 = +3 x 5 +0 x 7 +1 x 12
28 = +0 x 5 +4 x 7 +0 x 12
29 = +1 x 5 +0 x 7 +2 x 12
30 = +6 x 5 +0 x 7 +0 x 12
31 = +0 x 5 +1 x 7 +2 x 12
32 = +4 x 5 +0 x 7 +1 x 12
33 = +0 x 5 +3 x 7 +1 x 12
34 = +2 x 5 +0 x 7 +2 x 12
35 = +0 x 5 +5 x 7 +0 x 12
36 = +0 x 5 +0 x 7 +3 x 12
37 = +0 x 5 +5 x 7 +0 x 12
38 = +0 x 5 +2 x 7 +2 x 12
39 = +3 x 5 +0 x 7 +2 x 12
40 = +0 x 5 +4 x 7 +1 x 12
41 = +1 x 5 +0 x 7 +3 x 12
42 = +6 x 5 +0 x 7 +1 x 12
43 = +0 x 5 +1 x 7 +3 x 12
44 = +4 x 5 +0 x 7 +2 x 12
45 = +0 x 5 +3 x 7 +2 x 12
46 = +2 x 5 +0 x 7 +3 x 12
47 = +0 x 5 +5 x 7 +1 x 12
48 = +0 x 5 +0 x 7 +4 x 12
49 = +0 x 5 +5 x 7 +1 x 12
50 = +0 x 5 +2 x 7 +3 x 12
51 = +3 x 5 +0 x 7 +3 x 12
52 = +0 x 5 +4 x 7 +2 x 12
53 = +1 x 5 +0 x 7 +4 x 12
54 = +6 x 5 +0 x 7 +2 x 12
55 = +0 x 5 +1 x 7 +4 x 12
56 = +4 x 5 +0 x 7 +3 x 12
57 = +0 x 5 +3 x 7 +3 x 12
58 = +2 x 5 +0 x 7 +4 x 12
59 = +0 x 5 +5 x 7 +2 x 12
60 = +0 x 5 +0 x 7 +5 x 12
61 = +0 x 5 +5 x 7 +2 x 12
62 = +0 x 5 +2 x 7 +4 x 12
63 = +3 x 5 +0 x 7 +4 x 12
64 = +0 x 5 +4 x 7 +3 x 12
65 = +1 x 5 +0 x 7 +5 x 12
66 = +6 x 5 +0 x 7 +3 x 12
67 = +0 x 5 +1 x 7 +5 x 12
68 = +4 x 5 +0 x 7 +4 x 12
69 = +0 x 5 +3 x 7 +4 x 12
70 = +2 x 5 +0 x 7 +5 x 12
71 = +0 x 5 +5 x 7 +3 x 12
72 = +0 x 5 +0 x 7 +6 x 12
73 = +0 x 5 +5 x 7 +3 x 12
74 = +0 x 5 +2 x 7 +5 x 12
75 = +3 x 5 +0 x 7 +5 x 12
76 = +0 x 5 +4 x 7 +4 x 12
77 = +1 x 5 +0 x 7 +6 x 12
78 = +6 x 5 +0 x 7 +4 x 12
79 = +0 x 5 +1 x 7 +6 x 12
80 = +4 x 5 +0 x 7 +5 x 12
81 = +0 x 5 +3 x 7 +5 x 12
82 = +2 x 5 +0 x 7 +6 x 12
83 = +0 x 5 +5 x 7 +4 x 12
84 = +0 x 5 +0 x 7 +7 x 12
85 = +0 x 5 +5 x 7 +4 x 12
86 = +0 x 5 +2 x 7 +6 x 12
87 = +3 x 5 +0 x 7 +6 x 12
88 = +0 x 5 +4 x 7 +5 x 12
89 = +1 x 5 +0 x 7 +7 x 12
90 = +6 x 5 +0 x 7 +5 x 12
91 = +0 x 5 +1 x 7 +7 x 12
92 = +4 x 5 +0 x 7 +6 x 12
93 = +0 x 5 +3 x 7 +6 x 12
94 = +2 x 5 +0 x 7 +7 x 12
95 = +0 x 5 +5 x 7 +5 x 12
96 = +0 x 5 +0 x 7 +8 x 12
97 = +0 x 5 +5 x 7 +5 x 12
98 = +0 x 5 +2 x 7 +7 x 12
99 = +3 x 5 +0 x 7 +7 x 12
100 = +0 x 5 +4 x 7 +6 x 12
Forum Discuss Thread http://topic.csdn.net/u/20110621/09/ddb72b75-24ae-4b61-b908-90860ed5e410.html