題意本題首先給出已有的若干種面額的鈔票和各類鈔票數量,每次會給出乙個目標交易額,要求我們用已有鈔票得到可交付的最大現金,即可交付最大現金小於等於目標交易額。一家銀行計畫安裝一台用於提取現金的機器。
機器能夠按要求的現金量傳送適當的賬單。
機器使用正好n種不同的面額鈔票,例如d_k,k = 1,2,…,n,並且對於每種面額d_k,機器都有n_k張鈔票。
例如,n = 3,
n_1 = 10,d_1 = 100,
n_2 = 4,d_2 = 50,
n_3 = 5,d_3 = 10
表示機器有10張面額為100的鈔票、4張面額為50的鈔票、5張面額為10的鈔票。
東東在寫乙個 atm 的程式,可根據具體金額請求機器交付現金。
注意,這個程式計算程式得出的最大現金少於或等於可以根據裝置的可用票據**有效交付的現金。
input
程式輸入來自標準輸入。 輸入中的每個資料集代表特定交易,其格式為:cash n n1 d1 n2 d2 … nn dn其中0 <= cash <= 100000是所請求的現金量,0 <= n <= 10是 紙幣面額的數量,0 <= nk <= 1000是dk面額的可用紙幣的數量,1 <= dk <= 1000,k = 1,n。 輸入中的數字之間可以自由出現空格。 輸入資料正確。
output
對於每組資料,程式將在下一行中將結果列印到單獨一行上的標準輸出中。
sample input
735 3 4 125 6 5 3 350
633 4 500 30 6 100 1 5 0 1
735 0
0 3 10 100 10 50 10 10
sample output
73563000
hint
第乙個資料集指定一筆交易,其中請求的現金金額為 735。 機器包含3種面額的紙幣:4張鈔票 125、6張鈔票 5和3張鈔票 350。 機器可以交付所需現金的確切金額。
在第二種情況下,機器的票據**不能滿足所要求的確切現金數量。 可以交付的最大現金為 630。 請注意,在機器中組合鈔票以匹配交付的現金有多種可能性。
在第三種情況下,機器是空的,沒有現金交付。 在第四種情況下,請求的現金金額為 0,因此機器不交付現金。
從本題要求可以看出這是一道典型的dp揹包問題,進一步分析可以看出是多重揹包問題。多重揹包問題最好的解決辦法還是使用二進位制拆分優化。
二進位制拆分的思路由於涉及到了二進位制運算,所以思考起來有些複雜,但是其實很好理解。其中的關鍵部分就是將多個同種物品拆分成不同種物品,每種物品乙個,總而轉化成01揹包問題。這裡可以用7舉例,假如說有7個單價為a的物品,那麼將7進行二進位制拆分可以得到4,2,1三個數,這三個數可以表示1~7之間任一數字,所以本質上在dp過程中和7個數一樣。所以這種方法就把7個a拆分成了1個4a、1個2a和1個a。
本題運用的方法十分重要,所以需要學會且牢記,本題也可作為多重揹包問題模板記錄下來。
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define maxn 100005
#define ll long long
using
namespace std;
int f[
100005];
int n[15]
,d[15
],value[
10005];
int cnt,t,m;
void
split()
//二進位制拆分
if(tmp >0)
}}intmain()
split()
;for
(int i =
1; i <= cnt; i++
)//01揹包
} cout << f[t]
<< endl;
}return0;
}
多重揹包問題 二進位制拆分 東東與ATM
一家銀行計畫安裝一台用於提取現金的機器。機器能夠按要求的現金量傳送適當的賬單。機器使用正好n種不同的面額鈔票,例如d k,k 1,2,n,並且對於每種面額d k,機器都有n k張鈔票。例如,n 3,n 1 10,d 1 100,n 2 4,d 2 50,n 3 5,d 3 10 表示機器有10張面額...
多重揹包二進位制優化
多重揹包二進位制優化 將價值數量相同的物品分成1,2,4,8.因為100以內任何數都可以由幾個2的n次方數組成。所以,有遍歷沒乙個數變為遍歷每乙個2的n次方數。例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相...
多重揹包(二進位制優化)
馬上就要輕院校賽了,沒時間了,下面是網上找的多重揹包,感覺很好 void zeroonepack int cost,int weight,int n void completepack int cost,int weight,int n void multipack int c,int w,int ...