多重揹包問題 二進位制拆分 東東與ATM

2021-10-05 18:18:40 字數 1910 閱讀 5449

一家銀行計畫安裝一台用於提取現金的機器。

機器能夠按要求的現金量傳送適當的賬單。

機器使用正好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,因此機器不交付現金。

由於每種面額的鈔票的張數給定,我們可以將每張鈔票看作乙個個體,那樣就是普通的01揹包問題,但是由於組數過多所以效率很低,所以這時候便需要採用二進位制分解,例如我們將7長鈔票分解成(100),(010),(001)這三組,括號裡的都是二進位制寫法,這樣的話,通過對這三組的取捨選擇,可以拼湊出0到7共8個數,對於不是這麼完美分解的數例如13,我們可以先將他分解成(100),(010),(001),餘下來的6單獨為1組,這四組的組合同樣可以拼湊出0到13的每乙個數。

通過上面的二進位制分組操作可以將多重揹包問題轉化為普通揹包問題,為了節省空間消耗,採用滾動陣列的方式,因為我們求大小為j的空間裝前i個物品只用到了大小 <=j 的空間裝i-1個物品,因此我們便可以只設立乙個一維陣列儲存即可,注意對空間的遍歷要倒序。

#include

#include

#include

#include

using

namespace std;

vector<

int>c;

vector<

int>w;

int f[

100005];

vector<

int>ww;

int cash;

int n;

int cnt;

void

clear()

void

binarysplit()

if(t >0)

}}intmain()

cout << f[cash]

<< endl;

}}

東東與 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...

多重揹包(二進位制拆分優化)

多重揹包基本模型如下 給定n種物品,其中第i種物品的體積為vi,價值為wi,並且有ci個。有一容積為m的揹包,要求選擇若干個物品放入揹包,使得物品總體積不超過m的前提下,物品價值總和最大。輸入格式 第一行兩個整數,n,m,用空格隔開,分別表示物品種數和揹包容積。接下來有 n 行,每行三個整數 vi,...

多重揹包的二進位制拆分法

在多重揹包的直接拆分法中,個數為 c i 的物體被拆成 c i 種不同的物體 這樣就使得物體的種類增加了很多,使得演算法效率很低。上述方法把 c i 拆成 c i 個1,於是任意選擇可以表示出 1 到 c i 之間的所有數,從而達到多重揹包的目的 想到,從 2 0,2 1,2 2,2 k 任意選擇可...