使用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
- 如果cnt> = quantity[i],则
-
返回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