揹包問題 動態規劃 C C

2021-10-10 03:37:10 字數 1205 閱讀 4758

賣方:這件商品14元

買方:給你20元

賣方:不好意思,我的零錢不夠

買方:好吧,這是15元,剩的當小費

當到乙個地方旅遊時,如果你買東西的地方不支援信用,帶零錢還是非常有用的。特別是有時候賣方沒有零錢,如果你沒有剛好的錢,你需要支付比賣價多一點。

當然你想付盡量少的錢(至少是商品價值的錢)。並且,當支付最少錢的時候,也最好是支付的硬幣的數量最少。

第一行包含乙個整數表示測試資料的組數。每組測試資料每一行包含乙個整數,表示你需要付的錢數,錢數不超過10000元。接下來包含乙個整數n,表示你所擁有的錢的數量,n最多是100,接下來的n行每行乙個整數,表示你有的每個硬幣的面值,注意錢的面值可以是任意的,不和我們現在用的面值一樣,錢的面值不超過10000元。

對每組測試資料,在一行上輸出兩個整數:需要支付的錢數和數量。

1

1400

3500

1000

2000

1500 2
動態規劃問題,當成0-1揹包處理,也可以當成多重揹包。

這裡當成0-1揹包處理即可,物品最多就100種,每種取或不取

dp[j]是價值j需要dp[j]張錢

dp[j]先初始化正無窮,表示價值j的沒有錢可以湊出j

dp[0] = 0,表示0元需要0張錢。

遞推公式:

d p[

j]

=min(dp[j\ -\ num[i]]\ +\ 1,\ dp[j]) &\ i = 1 -> n,\ j = 20000 -> num[i] \end

dp[j]=

min(dp[i\ -\ 1][j\ -\ num[i]]\ +\ 1,\ dp[i\ -\ 1][j]) &\ j >= num[i] \\ dp[i\ -\ 1][j] &\ 0 <= j < num[i] \\ \end

dp[i][

j]=}

}return0;

}一開始陣列開10000,提交通過了

後來發現,有些測試資料應該通過不了

比如:

1

10000

29999

9999

19998 2
之前的**會什麼都不輸出,

把陣列開成20000就行了。

之前沒考慮這種特殊情況,碰巧通過了

動態規劃之揹包問題(C C )

給定n個物品,每個物品有乙個重量w和乙個價值v.你有乙個能裝m重量的揹包.問怎麼裝使得所裝價值最大.每個物品只有乙個.從這個問題中是給定了乙個容量沒m的揹包,和n個重量為w和價值為v的物品,我要用這n個物品是填充揹包使,填充的價值最大。這裡每個物品都有兩種狀態,放進揹包和不放入揹包。對於這個問題這裡...

動態規劃 揹包問題

給定n個物品,重量是,價值是,包的容量 承重 是w 問,放入哪些物品能使得包內價值最大 1 需要將問題轉化為子問題,通過遞迴實現,且子問題必然與父問題存在關聯 2 定義v i,j 表示為,當item取自前i個items且揹包capacity j 時,揹包問題的最優解,也即最高的價值。3 從前i個it...

動態規劃 揹包問題

不廢話,直接上 動態規劃,揹包問題。輸入為 int n 物品的種類數。int n weight 各件物品的重量。int n value 各種物品的價值。int w 揹包最大的裝載重量。輸出 v n b 的值,最大的裝載價值。x n 各類物品的裝載數量。author huangyongye publi...