剩餘最少的錢

2021-10-11 02:54:46 字數 2275 閱讀 4749

有一批**分別為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 種不同面值的硬...