使用5,7,12做加减运算,如果用最少步数得到任意数n
2011-06-27 15:32
393 查看
问题描述: 用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:
执行命令:
test.py -100 100 1
计算结果:
Forum Discuss Thread http://topic.csdn.net/u/20110621/09/ddb72b75-24ae-4b61-b908-90860ed5e410.html
数学模型:
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
相关文章推荐
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 比如你给它任意一个正整数,它可以按照一定的运算规则, 计算出得到1的最少操作次数。
- 使用n个1,2,3进行加减运算,最后结果还是1,2,3
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算
- 输入一个正数,对该数进行四舍五入到个位数的运算。例如,实数12.56经过四舍五入运算,得到结果13;而12.46经过四舍五入运算,得到结果12。
- 小易邀请你玩一个数字游戏,小易给你一系列的整数。你们俩使用这些整数玩游戏。每次小易会任意说一个数字出来,然后你需要从这一系列数字中选取一部分出来让它们的和等于小易所说的数字。 例如: 如果{2,1,2,7}是你有的一系列数,小易说的数字是11.你可以得到方案2+2+7 = 11.如果顽皮的小易想坑你,他说的数字是6,那么你没有办法拼凑出和为6 现在小易给你n个数,让你找出无法从n个数中选取部分求和
- 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算)
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 判断字符串是否可以通过交换相邻字符得到回文字符串,如果可以输出最少交换次数
- code for 使用n个1,2,3进行加减运算,最后结果还是1,2,3
- UVA10344五个数从前往后进行加减乘运算能否得到23
- [面试题] 5,7,12通过加减得到n,求最小步数(特点是5+7=12)
- 得到1的最少运算次数
- 12. 加入敌人和战斗:如果使用cocos2d制作基于tiled地图的游戏:第三部分
- 算法题: 求一个整数数组中,通过元素加减运算得到指定结果的所有运算过程. 例如【5,4,6,7,1】= 9 ?
- 新浪面试题:只允许使用++操作符实现加减乘除运算(c语言版)
- 在代码中,插入数据到数据库时,如果不使用事务,将会导致速度极慢
- 如果简单使用固定url实现类似友盟的在线参数
- 使用web方式导入如果导入大量数据
- JSF中得到selectOneMenu的使用