六、程序设计题 (16% , 每小题8分)
(1) 编写函数,检测给定的两维数组中是否有重复数据(已知该数组中保存了正整数):check_data(mat),如果没有重复,则函数返回真。要求算法的时间复杂度不大于O(n)。 def expand_list(list,num):
if len(list) > num:
return
for i in range(len(list),num):
list.append(0)
def check_data(list):
count = []
expand_list(count,10)
for line in list:
for var in line:
if var > len(count):
expand_list(count,var+1)
if count[var] == 0:
count[var] += 1
else:
return False
return True
(2) 设有一个背包能承受重量s(s>0), 又有n(n≥1)件物品, 其重量列表为
w=[w1,w2,...,wn]. 要从物品中挑选若干件放入背包, 使得放入的物品重量之和正好是s. 试设计递归函数f(w,s,n): 当有解时返回True,并显示所选物品是哪些; 无解时返回False。[提示:递归之处在于f(w,s,n)的真假等于f(w,s wn,n 1) or f(w,s,n 1)]
def f(w,s,n):
if s==0:
return True
elif (s<0) or (s>0 and n<1):
return False
elif f(w,s-w[n-1],n-1):
print w[n-1],
return True
else:
return f(w,s,n-1)