竞赛题笔记(一):凑算式

这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。

比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。

这个算式一共有多少种解法? 

Python解法1,普通递归版全排列:

def connect_int(i1,i2,i3):
    return  int(str(i1)+str(i2)+str(i3))

def dfs(nums):
    if len(nums)==9:
        if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10:
            global count
            count+=1
            print(nums)
        return 
    
    for i in range(1,10):
        print(nums)
        nums.append(i)
        print(nums)
        dfs(nums)
        nums.pop()

count=0
alist=[]
dfs(alist)

print(count)

解法1分析,这种用递归一个一个试所有全排列可能性的方法是十分低效的。

备注,可以利用sys.setrecursionlimit(3000)修改递归深度

Python解法2,优化版全排列:

import copy

def perm(n):
    data=[]
    
    if n==1:
        data.append([1])
    else:
        #m为n-1层data数据中的一项,存储了n-1位的全排列
        for m in perm(n-1):
            for j in range(len(m)+1):
                k=copy.copy(m)
                k.insert(j,n)
                data.append(k)
    return data

def connect_int(i1,i2,i3):
    return  int(str(i1)+str(i2)+str(i3))
count
=0 for nums in perm(9): if nums[0]+nums[1]/nums[2]+connect_int(nums[3],nums[4],nums[5])/connect_int(nums[6],nums[7],nums[8])==10: count+=1 print(nums) print(count)

解法2分析,优化后的全排列只需要递归9次,其余交给列表来做,其实insert方法对性能影响也不小,每次插入后需要重新移动元素,但比解法1高效。

备注:有时间还需要再分析下解法1为什么非常低效

可以直接留言交流问题或想法,每天都会看
原文地址:https://www.cnblogs.com/shitianfang/p/12383585.html