一家銀行計畫安裝一台用於提取現金的機器。
機器能夠按要求的現金量傳送適當的賬單。
機器使用正好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 的程式,可根據具體金額請求機器交付現金。
注意,這個程式計算程式得出的最大現金少於或等於可以根據裝置的可用票據**有效交付的現金。
輸入:程式輸入來自標準輸入。 輸入中的每個資料集代表特定交易,其格式為:cash n n1 d1 n2 d2 … nn dn其中0 <= cash <= 100000是所請求的現金量,0 <= n <= 10是 紙幣面額的數量,0 <= nk <= 1000是dk面額的可用紙幣的數量,1 <= dk <= 1000,k = 1,n。 輸入中的數字之間可以自由出現空格。 輸入資料正確。
樣例: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
output:
735
6300
0
第乙個資料集指定一筆交易,其中請求的現金金額為 735。 機器包含3種面額的紙幣:4張鈔票 125、6張鈔票 5和3張鈔票 350。 機器可以交付所需現金的確切金額。
在第二種情況下,機器的票據**不能滿足所要求的確切現金數量。 可以交付的最大現金為 630。 請注意,在機器中組合鈔票以匹配交付的現金有多種可能性。
在第三種情況下,機器是空的,沒有現金交付。 在第四種情況下,請求的現金金額為 0,因此機器不交付現金。
本題考查多重揹包。
時間複雜度優化:拆分轉換為01揹包
空間複雜度優化:使用滾動陣列
#include
#include
#include
using
namespace std;
int n,ans,a[11]
,b[11
],f[
100010
],v[
10010];
intmain()
if(tmp>0)
}for
(int i=
1;i<=cnt;i++)}
for(
int i=
1;i<=t;i++
) ans=
max(ans,f[i]);
cout<}return0;
}
程式設計思維與實踐 Week11作業E
即為多重揹包問題,其中要取得錢即為揹包得容量,每種面額的紙幣即為一種物品,其中每種面額的紙幣的數量即為這種物品的數量,在此題中,取得的錢的數量同時為物品的總價值和總重量。在經過這樣的轉化後,即可用多重揹包來求解,多重揹包可以通過拆分來減少複雜度。include include include inc...
東東開車了 Week11作業F題
東東開車出去泡妞 在夢中 車內提供了 n 張cd唱片,已知東東開車的時間是 n 分鐘,他該如何去選擇唱片去消磨這無聊的時間呢 輸入 多組輸入 每行輸入第乙個數字n,代表總時間,第二個數字 m 代表有 m 張唱片,後面緊跟 m 個數字,代表每張唱片的時長 例如樣例一 n 5,m 3,第一張唱片為 1 ...
程式設計思維與實踐 Week11 作業
蒜頭君從現在開始工作,年薪 n 萬。他希望在蒜廠附近買一套 60 平公尺的房子,現在 是 200 萬。假設房子 以每年百分之 k 增長,並且蒜頭君未來年薪不變,且不吃不喝,不用交稅,每年所得 n 萬全都積攢起來,問第幾年能夠買下這套房子?第一年年薪 n 萬,房價 200 萬 輸入格式 一行,包含兩個...