HDU 2844 Coins 多重揹包

2021-08-07 17:32:14 字數 752 閱讀 4604

source:

2009 multi-university training contest 3 - host by whu

題意:有n種不同的錢幣,每種錢幣的張數給定,問從這些錢幣中可以組合出多少種**,**範圍為1~m?

思路:將不同面值的錢幣看做揹包,符合多重揹包的模型,這裡講每個錢幣的花費和價值都令為它的面值,這樣之後統計能組合出多少種價值的時候直接判斷dp[i]==i?(意為當用不超過i的花費能取到的最大價值為i時即為可以組合到該**)

關於多重揹包:

就是模板,首先要單獨劃出zeroonepack(cost,value)和completepack(cost,value)兩個函式。爾後多重揹包時判斷若數目限制不起作用直接完全揹包,若起作用則化為若干揹包進行01揹包,劃分的方式為二進位制分解的方式(1,2,4,8...,n-2^k)

模板形式見**:

#include#include#includeusing namespace std;

int a[105],c[105],dp[100005];

int n,m;

void zeroonepack(int cost,int value)

}void completepack(int cost,int value)

}void multiplepack(int cost,int value,int amount)

int k=1;

while(k

HDU 2844 Coins 多重揹包

include include include include include using namespace std define clr c,v memset c,v,sizeof c const int inf 1 30 const int inf 1 30 const int m 1e5 1...

HDU 2844 Coins(多重揹包)

以前做題目光僅僅侷限於 0 1 揹包 和 完全揹包了。出來乙個 個數確定的揹包就不會了。看了網上的題解。原來是多重揹包。也就是說 用完全揹包和 0 1揹包混合求解的題目。應該是。對於 vi a i m 那麼就相當於乙個完全揹包。因為數量可以超過 最大限制。那麼就可以當做無限個使用。其他的 就需要二進...

hdu 2844 Coins 多重揹包

題意 給你一些不同價值和一定數量的硬幣,求用這些硬幣可以組合成價值在 1 m 之間的有多少 dp i 來表示容量為i這個包包可以裝多少價值,最後計數是要計價值和容量相等的個數 include include includeusing namespace std int sum,dp 100010 v...