有一批**分別為p1,p2, p3 … pn的n種商品, 你手中持有金錢為money,如何購買商品使剩餘的錢最少,求最少剩多少?
示例一:
輸入 p=[150, 200, 350], money = 250
輸出:50
示例二:
輸入 p=[150, 200, 350], money = 500
輸出:0
解法一,深度優先搜尋。
# 深度優先搜尋演算法, 個人感覺這種演算法就是將多層for迴圈扁平化
defleastmoneyleft
(money, prices)
: goods =
[money // x for x in prices]
# 錢數能買的各種商品最多的數量
dfs(prices,
0, money, goods)
defdfs
(prices, step, moneyleft, goodscount)
:'''
prices **列表
step 第幾次選擇
monkeyleft 當前還剩多少錢
goodscount 能買的各種商品數量是多少,list型別
'''# 由於ans是函式外部定義的,內部如果要修改(只讀取可以不加)則需要用global申明。
global ans
if step ==
len(prices)
:if moneyleft >=
0and moneyleft < ans:
ans = moneyleft
return
# 每種商品的可以選擇[0..goodscount[step]]件, 每種商品選擇完成後,再比對還剩多少錢
for i in
range
(goodscount[step]+1
):dfs(prices, step +
1, moneyleft - i * prices[step]
, goodscount)
解法二,暴力遞迴法
此時換了個思路,剩餘的錢最少,也即能買到的價值最大。 即用money能買到的價值最多的商品。
# 暴力遞迴解法
import sys
# 能買價值最多的東西
defdp
(amount, prices)
:# 小於等於0時,能買的最大價值為0
if amount <=0:
return
0 res =
-sys.maxsize -
1# 定義最小值
for p in prices:
# 金額買不起時contine
if amount < p:
continue
# amount - p的錢 能買的最大價值
subvalue = dp(amount - p, prices)
res =
max(subvalue + p, res)
return res if res !=
-sys.maxsize -
1else
0# 在此基礎上可以加入備忘錄來優化時間複雜度
注意,此方法得到的是買到的最大價值,求最少剩餘錢數,還需要錢數減去最大價值。
解法三,動態規劃。
暴力遞迴是至頂向下求解,而動態規劃是從底向上的遞推求解。
# dp迭代解法
defleastmoneyleft2
(amount, prices)
:# dp[i] 表示金額i可以買到的最大價值
# dp[0]也對應一種狀態,故對應amount時dp的長度應為amount + 1
dp =[0
for i in
range
(amount +1)
]# 因為要求解的是dp[amount],故list的長度為amount + 1
# base case
dp[0]
=0for a in
range
(len
(dp)):
for p in prices:
# 錢不夠,買不起
if(a - p)
<0:
continue
dp[a]
=max
(dp[a]
, dp[a - p]
+ p)
return amount - dp[amount]
貪心 帶最少的零錢
你就要去購物了,現在你手上有n種不同面值的硬幣,每種硬幣有無限多個。為了方便購物,你希望帶盡量少的硬幣,但要能組合出1到x之間的任意值。第一行兩個數x n,以下n個數,表示每種硬幣的面值。資料規模 對於30 的資料,滿足n 3,x 20 對於100 的資料,滿足n 10,x 1000.最少需要攜帶的...
建站最少需要多少錢
市面上有很多免費建站產品,用這種免費產品的限制很多,比方說每月限制300訪問,也就是每天10個人點開你的 有廣告 資源庫只有30m容量 不能有外部鏈結 沒有互動 不支援seo等等。下面就說一下不使用市面上的免費建站產品,建乙個 到底最低需要多少錢。1 網域名稱 可選項 為什麼是可選項呢?因為只要是能...
演算法實踐 最少零錢問題
參考程式 include include include define max 20002 define inf 9999999 define min a,b a b b a int t 11 coins 11 n 硬幣面值陣列 t,可以使用的各種面值的硬幣個 數陣列 coins,n 種不同面值的硬...