1. 程式人生 > >零件分組【貪心演算法習題python】

零件分組【貪心演算法習題python】

題目描述

某工廠生產一批棍狀零件,每個零件都有一定的長度(Li)和重量(Wi)。現在為了加工需要,要將它們分成若干組,使每一組的零件都能排成一個長度和重量都不下降(若i<j,則Li<=Lj,Wi<=Wj)的序列。請問至少要分成幾組?

輸入輸出格式

輸入格式:

第一行為一個整數N(N<=1000),表示零件的個數。第二行有N對正整數,每對正整數表示這些零件的長度和重量,長度和重量均不超過10000。

輸出格式:

僅一行,即最少分成的組數。

輸入輸出樣例

輸入樣例#1:

5
8 4 3 8 2 3 9 7 3 5

輸出樣例#1:

2

分析:

1.優先按照長度排列,長度相等按照重量排列。

2.一次遍歷零件,滿足條件的零件加入同一組。

def min_group(num_obj, obj_feature_pair):
    pair_list = []      # 組成對
    processed_list = []     # 被分組過的零件
    group = 0   # 組數
    for i in range(0, len(obj_feature_pair), 2):
        pair_list.append([obj_feature_pair[i], obj_feature_pair[i+1]])
    pair_list.sort(key=lambda i:(i[0],i[1]))    # 按照長度-》重量排列零件
    while len(processed_list) != num_obj:
        min_f1 = -float('inf')
        min_f2 = -float('inf')
        start_flag = False    # 出現滿足條件的零件標識
        for index, pair in enumerate(pair_list):
            if pair[0] >= min_f1 and pair[1] >= min_f2 and index not in processed_list:
                start_flag = True
                min_f1 = pair[0]
                min_f2 = pair[1]
                processed_list.append(index)
        if start_flag:
            group += 1
    return group

print(min_group(5, [8, 4, 3, 8, 2, 3, 9, 7, 3, 5]))