题目要求:给定一个数组arr=[2,3,4,5],N=2345,求使用arr中的数字,组成一个不大于N的最大的数字。arr中的数字可以多次使用。
# https://blog.csdn.net/qq_36282995/article/details/126078742
import sys
def init(N):
'''
:param N: 被拆的数字N
:return: 数字被拆成一个一个的放入list
'''
single_num_list = []
while N:
m = N % 10
N = N // 10
single_num_list.insert(0, m)
return single_num_list
def dfs(step, flag, single_num_list, N, selects, options):
'''
:param step: 第几层,第0层表示selects还未填入数字
:param flag: 前面的选择是否和N的前几位完全匹配
:param single_num_list: N被拆的一位一位的list
:param N:
:param selects: 选择的数字
:param options:
:return: 是否得到结果,没有结果返回None, 否则是selects
'''
if step == len(single_num_list):
if flag == True:
return None
else:
return selects
if flag == False:
# 直接选最大的即可
selects.append(options[-1])
return dfs(step + 1, flag, single_num_list, N, selects, options)
for i in range(single_num_list[step], -1, -1):
if i in options:
selects.append(i)
if i != single_num_list[step]:
flag = False
ans = dfs(step + 1, flag, single_num_list, N, selects, options)
if ans:
return ans
selects.pop()
def list_to_num(single_num_list):
'''
:param single_num_list:
:return: 将一位一位的数字合成数字N
'''
ans = 0
for i in range(len(single_num_list)):
ans = ans*10 + single_num_list[i]
return ans
if __name__ == '__main__':
options = [2,4]; N = 420
options.sort()
single_num_list = init(N)
selects = []
ans = dfs(0, True, single_num_list, N, selects, options)
if not ans:
if len(single_num_list)==1:
print("没有答案")
sys.exit()
else:
ans = [options[-1]]*(len(single_num_list)-1)
print(list_to_num(ans))
# options = [0,5]; N=5
# options = [5]; N = 5
# options = [5]; N = 555
# options = [2,3,4,5]; N = 2345
# options = [0,2]; N = 2000
# options = [2,4]; N = 2445
# options = [2,4]; N = 2444
# options = [2,3,9]; N = 2244
# options = [2,4]; N = 420