题意:给出m,再给出物品价值和物品个数,然后问最后组合的硬币能有多少个满足<=m呢?
题解:直接使用多重背包填满背包的打法
附上代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e2+5;
const int maxm=1e5+5;
int n,m,a[maxn],c[maxn],dp[maxm];
void zeroonepack(int v)
{
for(int i=m;i>=v;i--){
if(dp[i-v]==1){
dp[i]=1;
}
}
}
void completepack(int v)
{
for(int i=v;i<=m;i++){
if(dp[i-v]==1){
dp[i]=1;
}
}
}
void multipack(int v,int num)
{
if(v*num>=m){
completepack(v);
return ;
}
for(int k=1;k<=num;k<<=1){
zeroonepack(k*v);
num-=k;
}
if(num){
zeroonepack(num*v);
}
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&n&&m){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&c[i]);
}
memset(dp,-1,sizeof(dp));
dp[0]=1;
for(int i=1;i<=n;i++){
multipack(a[i],c[i]);
}
int cnt=0;
for(int i=m;i>=1;i--){
if(dp[i]==1){
cnt++;
}
}
printf("%d\n",cnt);
}
return 0;
}