KKai_PIN 2020-09-14 11:10 采纳率: 100%
浏览 131
已采纳

关于combination和循环的使用

想问一个关于Python的问题:

我使用def函数
x = 可送的外卖
y = 客人预订的外卖
def(x, y)

例如今天接受了客人的预订有 10 7 6 6

如果餐厅可送16份 刚好10+6=16
如果餐厅可送8份 只有7

就类似这个道理 如何算出使餐厅利益最大化的函数啊 只能使用combination函数吗
可不可以使用for in或者while的函数来设置函数

  • 写回答

1条回答 默认 最新

  • 我爱py数据分析 2020-09-14 11:48
    关注

    你是问编程思路吗,这是一个典型的01背包问题呀

    # -*- coding: utf-8 -*-
    """
    Created on Mon Sep 14 22:02:39 2020
    
    @author: Lenovo
    """
    
    # 01 背包问题
    # y 既看作重量,又看做价值
    # x 看作是背包的容量
    import numpy as np
    y=[10,7,6,6]
    x=16  
    def solver(x,y):
        weight=x
        value=np.zeros((len(y),),dtype=np.int) #初始化value数组,这里value和y的值一样
        w=np.zeros((len(y)+1,x+1),dtype=np.int) #初始化进行动态规划的数组,因为需要得出是拿了哪些物品,所以选用二维数组
    
        for i in range(len(y)):
            value[i]=y[i]
    
        #下面是最重要的代码,注意 w 数组的维数,物品的个数+1,背包重量+1
        for i in range(len(y)):
            j=1
            while(j<=x):
                if(j<y[i]):
                    w[i+1][j]=w[i][j]
                else:
                    w[i+1][j]=max(w[i][j],w[i][j-y[i]]+value[i])
                j=j+1
        print('最优的value是: %d' % w[len(y)][x])
    
        judge=np.zeros((len(y),),dtype=np.int) # judge是判断数组,判断每个物品是否被拿了,
        # 我们可以发现,如果第j个物品没有被拿走,则有 w[j][x]==w[j-1][x],从而judge[j-1]=0
        # judge=0,表示未拿 judge=1,表示拿了
    
        j=len(y)
    
    
        while(j>1):
            if(w[j][x]==w[j-1][x]):
                judge[j-1]=0
            else:
                judge[j-1]=1
                x=x-y[j]
            j=j-1
    
    
        print(w)
        if w[1][weight]>0:
            judge[0]=1
        else :
            judge[0]=0
    
        #单独判断第一个物品有没有被拿
    
    
        for i in range(len(y)):
            if(judge[i]==1):
                print('给第%d个客人送外卖' % (i+1))
    
    
    solver(x,y)   
    
    
    # 如果不需要知道是拿走了那些物品,则可以只使用一维数组
    def easy_solver(x,y):
        value=np.zeros((len(y),),dtype=np.int)
        w=np.zeros((x+1,),dtype=np.int)
        for i in range(len(y)):
            value[i]=y[i]
    
        for i in range(1,len(y)+1):
            j=x;
            while(j>=y[i-1]):
                w[j]=max(w[j],w[j-y[i-1]]+value[i-1])
                j=j-1
    
        print('最优的value是: %d' % w[x])
    
    
    easy_solver(x,y)
    

    如果帮到你解决问题,麻烦点一下采纳

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 基于卷积神经网络的声纹识别
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 CSAPPattacklab
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图
  • ¥15 stm32开发clion时遇到的编译问题