有如下N个物品,价格为 {g1,g2,g3,g4,…,gn},将物品分成订单,每个订单物品数量不超过M(int),每个子订单总金额不超过Y,但尽可能大,求怎么分单才能使得订单数(Num)值最小?(ps:可以理解为所有基本数据为int类型)
4条回答 默认 最新
- 南方勇士 2018-08-10 09:24关注
此方法可行,价格列表越长,准确性越大,但是对内存和时间要求特别大,价格列表越长时间和内存指数增长
COUNT = 0
list_all=[]
sum = []
#实现全排列的函数
def perm(n, begin, end):
global COUNT
if begin >= end:
list_all.append(n)
COUNT += 1
else:
i = begin
for num in range(begin, end):
n[num], n[i] = n[i], n[num]
perm(n, begin + 1, end)
n[num], n[i] = n[i], n[num]def analizy(M,Y):
for v in list_all:#遍历所有价格排列的可能l = [i for i in v]#将一个 list 映射为另一个 list,每个元素设为变量i,对每个可能价格列表切成M大小的子列表 list_son=list([l[i:i + M] for i in range(0, len(l), M)]) for a in list_son:#遍历字列表,对每个子列表求和,并判断符合最大商品数和小于最大金额的子列表,然后放到list——sonson列表中,其余的组成一个新列表重新开始,M此时递减 list_sonson=[] list_rest=[] sum2=0 for c in a: sum2+=c if len(a)==M and sum2<=Y: list_sonson.append(a) global sum1 sum1=len(list_sonson) sum1+=sum1 else: list_rest.extend(a) if len(list_rest)==0: break elif len(list_rest)==1: sum1+=1 else: perm(list_rest, 0, len(list_rest)) M-=1 analizy(M, Y) sum.append(sum1)#把每一种价格排列,组成的组数放入sum1列表中,注意这里的顺序是和群排列的顺序一样的,一次可以找出对应的那价格排列
#价格列表
n = [4,5,35,46,12,59,25,46,45,29]
perm(n, 0, len(n))
analizy(M=3,Y=82)#M是最大商品数,Y是订单最大金额#因为用min函数不能直接对列表求多个最小值相同及其下标。
min = min(sum)
list_dict=[]
for v in sum:
if v==min:
v_index=sum.index(v)
dic = {v:v_index}
list_dict.append(dic)print("全排列结果有{}种".format(COUNT))
print("最小组数对应价格列表排列的下标和list_dict里对应的下标列表:\n{}".format(list_dict))#根据此列表可以找出对应的那个最少组数的价格排列,本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 如何在scanpy上做差异基因和通路富集?
- ¥20 关于#硬件工程#的问题,请各位专家解答!
- ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
- ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
- ¥30 截图中的mathematics程序转换成matlab
- ¥15 动力学代码报错,维度不匹配
- ¥15 Power query添加列问题
- ¥50 Kubernetes&Fission&Eleasticsearch
- ¥15 報錯:Person is not mapped,如何解決?
- ¥15 c++头文件不能识别CDialog