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