好友
阅读权限20
听众
最后登录1970-1-1
|
KDME
发表于 2021-11-12 18:31
之前有人在做标书中碰到这样的问题,简化问题,假设报价表中有4项材料,每项材料的单价和数量都有,每项材料的单价乘以数量等于总价,每项材料的总价之和即合价,现在老板的报价低于合价,要求调整每项材料的单价,使之算出来的目标合价等于老板的报价。目的是求出每项材料的报价。
举例,材料=[甲,乙,丙,丁],单价=[11,22,3,44],数量=[1,2,3,4],总价=[11*1,22*2,3*3,44*4]=[11,44,9,176],合价=sum(总价)=11+44+9+176=240,老板的报价=200,目标单价=[11,22,3,34]。验证11*1+22*2+3*3+34*4=200=报价。所以[11,22,3,34]就是我需要的一组目标单价。
小工具的几点说明。输入数据时,两项之间可以用空格,逗号,句号等分割;几组答案是指需要几组目标单价;材料没有项数的限制,可以是4项,也可以是40项,等等;每项材料的单价设置的下浮范围是1/3.
半年都没有动它了,当时搞出来这个小工具,是非常激动地,也封装成exe文件,10M大小,小白新人,向大佬学习!
[Python] 纯文本查看 复制代码 #mbdj-0.3.py,目标单价小小程序0.2版,简化了得到的结果,减少了多余不必要的工作,并进行了包装工作,用到tkinter包。
import tkinter as tk
from tkinter.scrolledtext import ScrolledText
import re
master = tk.Tk()
tk.Label(master, text="各项数量:").grid(row=0)##################标尺
tk.Label(master, text="各项单价:").grid(row=1)
tk.Label(master, text="目标总价:").grid(row=2)
tk.Label(master, text="几组答案:").grid(row=3)
e1 = tk.Entry(master,width=66)
e2 = tk.Entry(master,width=66)
e3 = tk.Entry(master,width=66)
e4 = tk.Entry(master,width=66)
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
def mbdj(sl,dj,mbj,jzmbdj):#目标单价
n = len(sl)
xin_dj = [0]*n
break_signal = False
counter = 0
result = []
fin_result = None
def digui(k):#递归
nonlocal break_signal,counter
if k >= n:
dxhj = list(map(lambda x,y : x*y , sl, xin_dj))#单项合价
if int(sum(dxhj)) == mbj*100:
hy_xin_dj = [i/100 for i in xin_dj]
result.append(hy_xin_dj)
counter += 1
if counter >= jzmbdj:
fin_result = result
text = ScrolledText(master, width=80, height=32)
text.insert("insert",fin_result)
text.grid(row=4,column=0,columnspan=2)
break_signal = True
else:
for i in range(int(dj[k]*100),int(dj[k]*66.7),-1):
xin_dj[k] = i
if break_signal:
break
digui(k+1)
digui(0)
return fin_result
def show():
sl = [float(i) for i in re.split('[,, ;;\t、/。\\\\]',e1.get())]
dj = [float(i) for i in re.split('[,, ;;\t、/。\\\\]',e2.get())]
mbj = float(e3.get())
jzmbdj = float(e4.get())
mbdj(sl,dj,mbj,jzmbdj)
e1.delete(0, "end")
e2.delete(0, "end")
e3.delete(0, "end")
e4.delete(0, "end")
tk.Button(master, text="获取答案", width=10, command=show).grid(row=5, column=0, sticky="w", padx=10, pady=5)
tk.Button(master, text="退出", width=10, command=master.quit).grid(row=5, column=1, sticky="e", padx=10, pady=5)
master.mainloop() |
|