演算法小練習 根據上排數求下排數

2021-09-01 15:05:29 字數 2028 閱讀 4380

參考 

給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數   

要求下排每個數都是先前上排那十個數在下排出現的次數。   

上排的十個數如下:   

【0,1,2,3,4,5,6,7,8,9】

舉乙個例子,   

數值: 0,1,2,3,4,5,6,7,8,9   

分配: 6,2,1,0,0,0,1,0,0,0   

0在下排出現了6次,1在下排出現了2次,   

2在下排出現了1次,3在下排出現了0次....   

以此類推..   

關鍵是理解「要求下排每個數都是先前上排那十個數在下排出現的次數」。

做以下分析:設總共有n個數,上排a[0...n-1],下排b[0...n-1],。

1)下排n個數的累加和為n,即b[0]+b[1]+...+b[n-1] = n

2)ai*bi的累加和也為n,即a[0]*b[0]+a[1]*b[1]+...+a[n-1]*b[n-1] = n

3)對於b中任意乙個元素b[j], 都存在i,a[i] = b[j].

還可以分析出更多的限制條件,這裡就不繼續了。

可參考

根據以上分析,可以看出其實這個題目的本質是乙個多元一次不定方程。在未知數較少,分析出的限制條件越多的情況下,手算出結果是完全可能的。下面根據以上條件給出**

思路:依次將下排陣列b的最後乙個元素值設定為上排陣列a的第i個元素值;

如果滿足條件2), 則兩個陣列大小減1, 遞迴這個過程。

如果陣列大小為0, 說明遞迴結束, 檢查條件1)和2)是否滿足, 若滿足則列印出結果。

# -*- coding: utf-8 -*-

# 求兩個列表的乘積和

def list_sum(a, b):

size = len(a)

c = [a[i] * b[i] for i in range(0, size)]

#print c

return sum(c)

# 檢查a每個元素中每個元素在b中出現的次數是否滿足要求

def check(a, b):

for i in range(len(a)):

if b.count(a[i]) != b[i]:

return false

return true

# a 上排陣列

# b 下排陣列

# target 目標和(列表大小)

# size 列表當前大小

def calc(a, b, target, size):

if 0 == size:

if sum(b) == target and list_sum(a, b) == target:

#print b, check(a, b)

if check(a, b):

print a

print b

print '*' * 10

return

for i in range(0, target):

b[size - 1] = a[i]

if b[size - 1] * a[size - 1] <= target:

calc(a, b, target, size - 1)

if __name__ == '__main__':

'''a = [0,1 , 2, 3, 4, 5, 6, 7, 8, 9]

b = [0 for i in range(0, 10)]

calc(a, b, 10, 10)

'''

a = [0,1 , 2, 3, 4, 5, 6, 7]

b = [0 for i in range(0, 8)]

calc(a, b, 8, 8)

'''# 上排無0, 全0解

a = [1 , 2, 3, 4, 5, 6, 7, 8]

b = [0 for i in range(0, 8)]

calc(a, b, 8, 8)

'''

執行結果如下

求上排的數在下排出現的次數

題目 舉乙個例子 數值 0,1,2,3,4,5,6,7,8,9 分配 6,2,1,0,0,0,1,0,0,0 0在下排出現了6次,1在下排出現了2次。2在下排出現了一次,以此類推 include using namespace std define len 10 class numbertb num...

根據上排十個數,算出下排十個數

以下為一給出的數學解法,還沒細看正確與否,先記下,留待後用 給你10分鐘時間,根據上排給出十個數,在其下排填出對應的十個數 要求下排每個數都是先前上排那十個數在下排出現的次數。上排的十個數如下 0,1,2,3,4,5,6,7,8,9 舉乙個例子,數值 0,1,2,3,4,5,6,7,8,9 分配 6...

練習 求完數問題

題目 乙個數如果恰好等於它的因子之和,這個數就稱為 完數 例如,6的因子為1 2 3,而6 1 2 3,因此6是 完數 程式設計序找出1000之內的所有完數,並按下面格式輸出其因子 6 its factors are 1 2 3 原帖 評析與重構 求完數問題 下面是我的 思想不多說,貪心演算法。in...