使用5,7,12做加减运算,如果用最少步数得到任意数n

问题描述: 用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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值