找錢 多重揹包 計數

2022-02-27 05:19:10 字數 2073 閱讀 6721

也許更好的閱讀體驗

\(\mathcal\)

小 \(l\) 所在的 \(l\) 國由於沒有普及移動支付,依然在大規模使用紙幣。一共有 \(n\)

種面值的紙幣,面值互不相同。一天小 \(l\) 去商店購買乙個**為 \(x\) 元的物品,

他提前知道了自己手裡和店員手裡每種面值的紙幣的數量,他想知道一共有多少

種付錢-找錢的方式。兩種付錢-找錢的方式不同,當且僅當存在一種面值,在兩

種方案中小 \(l\) 付出的該種面值的紙幣數量不同或店員找的該種面值的紙幣數量

不同。此外,設小 \(l\) 付出的紙幣面值總數為 \(y\),則小 \(l\) 付出的紙幣中不能存在

面值小於等於 \(y-x\) 的紙幣(不然就沒有必要付這張紙幣了)。

輸入格式

第一行輸入兩個正整數 \(n,x\),分別表示紙幣面值的數量以及小 l 想要購買的商品的**。

接下來 \(n\) 行每行三個整數 \(a_i,b_i,c_i\),分別表示第 i 種紙幣的面值,小 x 擁有的該種紙幣數量,店員擁有的該種紙幣數量,保證面值 \(a_i\) 單調增加。

輸出格式

一行輸出乙個整數,表示總方案數對 \(1000000007\) 取模的結果。

資料範圍

對於所有資料,滿足 \(ai>0\);

對於 \(30\%\)的資料,\(n,x,ai,bi,ci≤8\);

對於 \(60\%\)的資料,\(n,x,ai,bi,ci≤100\);

對於 \(100\%\)的資料,\(n≤1000,x,ai,bi,ci≤10000\)。

\(\mathcal\)

兩種方法

顯然的想法是做多重揹包

設\(fa_i\)表示小\(l\)能夠符合題意地湊出\(i\)元的方案數

\(fb_i\)表示店員能夠找出\(i\)元的方案數

便可以直接多重揹包

暴力\(d\)顯然會超時,用二進位制分組還是會\(t\)

法一

設列舉到的錢幣面值為\(w\),數量為\(num\)

觀察發現,\(f_i=f_+f_+\ldots+f_\),其中\(k\leq num\)

考慮設\(s_i\)表示\(f_+f_+f_+\ldots+f_\),其中\(i\geq kw,i< (k+1)w\)

於是有\(f_i=s_i-[i\geq (num+1)w]s_\)

對於每個物品都這麼做,複雜度為\(nx\)

法二

這個方法好像是套路,對於多重揹包計數就可以這樣做

類似于容斥

仍然是設列舉到的錢幣面值為\(w\),數量為\(num\)

先不管上界直接做完全揹包

之後將算多了的減去

即\(f_i-=f_\)

實際上,這兩種方法是換湯不換藥的

\(\mathcal\)

/*******************************

author:morning_glory

lang:c++

created time:2023年10月21日 星期一 20時18分58秒

*******************************/

#include #include using namespace std;

const int maxn = 20004;

const int mod = 1000000007;

//}cin;

//}}}

int n,c,ans;

int fa[maxn],fb[maxn],w[maxn],ha[maxn],hb[maxn],s[maxn];

// if (x=(num+1)*v) f[i]=m(f[i]-s[i-(num+1)*v]); }}

//}}}

int main()

如有**講得不是很明白或是有錯誤,歡迎指正

如您喜歡的話不妨點個贊收藏一下吧

poj 1787 多重揹包(硬幣付款不找錢)

題意 分硬幣,有1,5,10,25四種硬幣,給定每種硬幣的數量,給定要組合成的價值,問剛好達到價值時用的硬幣最多的情況。思路 dp j 表示 j 塊錢最多由多少塊硬幣組成,used j 表示 j 塊錢時,已經放了多少同種類的硬幣。實際上path用一維陣列即可,使得 path j 表示 上一次最多有多...

python多重揹包 多重揹包

多重揹包問題 有 n 種物品和乙個容量是 v 的揹包。第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。資料範圍 0 n v 100 0 vi wi si 100 樸素版多重揹包問題 樸素版完全揹包問...

多維多重揹包問題 01揹包,完全揹包,多重揹包

csdn 專業it技術社群 登入 blog.csdn.net有n件物品和乙個容量為v的揹包。第i件物品的費用是w i 價值是v i 求將哪些物品裝入揹包可使價值總和最大。1.1空間優化 這要求在每次主迴圈中我們以 v v 0 的遞減順序計算 f v 這樣才能保證計算 f v 時 f v ci 儲存的...