問題描述:
商店中每種商品都有標價.例如,一朵花的**是2元.乙個花瓶的**是5元.為了吸引顧客,商店提供了一組優惠商品價. 優惠商品是把一種或多種商品分成一組,並降價銷售.例如,3朵花的**不是6元而是5元.2個花瓶加1朵花的***是10元.是設計一種演算法,計算出某一顧客所購商品應付的最少費用.
參考的知識:動態規劃. 程式語言不限.
題目分析:
首先確定需要哪些資料,要想實現這個題目,我們需要如下幾個資料,
共有多少種優惠方案s_num,每個優惠方案的構成第i種物品需要幾 個,並且優惠後**為多少的乙個資料村粗s1,s2,s3等等,優惠方案 組成的列表s。客戶需要的商品數量s,以及商品**p。
2.其次要確定購物最消費的實現目的, 我們的目的是顧客的要求依據商家的優惠規則得出乙個最優的優惠組合方案, 然後輸出最低**。
3.演算法思想實現如下:通過遞迴, 我們可以遍歷所有的優惠規則, 如果滿足優惠規則,那麼就會產生乙個新的子問題,這個子問題同樣是計算當前狀態的最小花費情況,需要我們注意的是,優惠規則很有可能是多個的,那麼我們在考慮這n個優惠規則時候,產生的n個子問題的最優解加上***格,得到最小值,就是我們所需要的。這個時候就會用到遞迴去實現。遞迴停止的條件就是如果所有的優惠規則都不滿足則返回剩餘商品的按原價得出的總價. 通過這樣的思想,我們就可以計算出使用者需要的物品的最優優惠方案。
4.狀態轉移方程式:f(a1,a2,a3,a4,a5)= min
:# 共有多少種優惠方案
s_num =
2# 每個優惠方案的構成第i種物品需要幾個,並且優惠後**為
s1 =[(
"a1",3
),("a2",0
),("a3",0
),("a4",0
),("a5",0
),5]
s2 =[(
"a2",1
),("a2",2
),("a3",0
),("a4",0
),("a5",0
),10]
#s3 = [("a2", 1), ("a2", 1), ("a3", 1), ("a4", 0), ("a5", 0), 10]
# 優惠方案組成的列表
s =[s_num, s1, s2]
# 使用者需要的第i種商品的數量
num_1 =
int(intput(
"please input the amount of goods:"))
num_2 =
int(intput(
"please input the amount of goods:"))
num =
[num_1 ,num_2,0,
0,0]
# 每種商品對應的**
p =[2
,5,0
,0,0
]# 求出最優惠的**
a = mincost(num, p, s)
(a)if __name__ ==
"__main__"
: main(
)執行結果:
最小費用流 用SPFA實現
1 找到一條從源點到達匯點的 距離最短 的路徑,距離 使用該路徑上的邊的單位費用之和來衡量。2 然後找出這條路徑上的邊的容量的最小值f,則當前最大流max flow擴充f,同時當前最小費用min cost擴充 f min dist s,t 3 將這條路徑上的每條正向邊的容量都減少f,每條反向邊的容量...
最小費用流
include include define maxn 61 define maxv maxn maxn 2 1 define maxe maxv 5 define oo 2147483647 define min a,b a b b a define maxq maxe using namespa...
最小費用流
int v 頂點數 vector g max v int dist max v 最短距離 int prev max v 最短路中前驅結點對應的點 int pree max v 最短路中前驅結點對應的邊 void addedge int from,int to,int cap,int cost 求從s...