使用Python分配重复整数的程序

使用Python分配重复整数的程序

假设我们有一个名为nums的数组,其中最多有50个唯一值。我们还有另一个名为quantity的数组,其中quantity[i]表示第i个用户订购的值的数量。我们必须检查是否可能分配nums,使得

  • 第i个客户正好获得quantity[i]项,

  • 第i个客户获得的值全部相等,且

  • 所有用户都满意。

因此,如果输入如下nums = [5,1,2,2,3,4,4,3,3] quantity = [2,2,3],则输出将为True,因为两个客户都想要每个两个元素,所以他们可以得到[2,2]和[4,4],第三个客户想要三件物品,他们可以得到[3,3,3],因此所有客户都满意。

为了解决这个问题,我们将按照以下步骤进行 –

  • 定义util()函数,该函数将使用i和cntr

  • 如果i与quantity的大小相同,则

    • 返回True
  • temp_counter:制作cntr的副本

  • 对于cntr中的每个cnt,执行以下操作

    • 如果cnt> = quantity[i],则
      • temp_counter[cnt]:-1

      • 如果temp_counter[cnt]与0相同,则

      • 从temp_counter中删除第cnt个元素

      • rem:cnt – quantity[i]

      • temp_counter[rem]:+1

      • 如果util(i + 1,temp_counter)为true,则

      • 返回True

      • temp_counter[rem]:-1

      • 如果temp_counter[rem]与0相同,则

      • 从temp_counter中删除第rem个元素

    • temp_counter[cnt]:+1

  • 返回False

  • 从main方法开始,执行以下操作

  • cnt:保存nums中出现的数字的所有频率的频率的映射

  • 以相反的顺序对quantity进行排序

  • 返回util(0,cnt)

示例

让我们看一下以下实现,以获得更好的理解

from collections import Counter
def solve(nums, quantity):
   def util(i, cntr):
      if i == len(quantity):
         return True

      temp_counter = cntr.copy()
      for cnt in cntr:
         if cnt >= quantity[i]:
            temp_counter[cnt] -= 1
            if temp_counter[cnt] == 0:
               temp_counter.pop(cnt)
         rem = cnt - quantity[i]
         temp_counter[rem] += 1

         if util(i+1, temp_counter):
            return True

         temp_counter[rem] -= 1
         if temp_counter[rem] == 0:
            temp_counter.pop(rem)
         temp_counter[cnt] += 1

      return False

   cnt = Counter(Counter(nums).values())
   quantity.sort(reverse=True)
   return util(0, cnt)

nums = [5,1,2,2,3,4,4,3,3]
quantity = [2,2,3]
print(solve(nums, quantity))

输入

[0,1,2,3,4],[[3,1],[1,3],[5,6]]

输出

True

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程