HDU 2844 coins

做的第一个多重背包,看了背包九讲之后才把模板看懂,真心觉得背包九讲不错
#include <iostream>
#include<stdio.h>
#include<string>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100010
using namespace std;
int vol[N],val[N];
int n,m;
int dp[N];
void zeroonebag(int c,int w)
{
    for(int i=m;i>=c;i--)
    dp[i]=max(dp[i],dp[i-c]+w);
}
void combag(int c,int w)
{
    for(int i=c;i<=m;i++)
    dp[i]=max(dp[i],dp[i-c]+w);
}
void mulbag(int c,int w,int p)
{
    if(c*p>m)combag(c,w);
    else
    {
        int k=1;
        while(k<p)//二进制转化思想
        {
            zeroonebag(c*k,w*k);
            p-=k;
            k<<=1;
        }
        zeroonebag(p*c,p*w);
    }
}
int main()
{
    while(~scanf("%d%d",&n,&m))
    {
        if(n+m==0)break;
        memset(dp,0,sizeof(dp));
        for(int i=1;i<=n;i++)
        scanf("%d",&val[i]);
        for(int i=1;i<=n;i++)
        scanf("%d",&vol[i]);

        for(int i=1;i<=n;i++)
        {
            mulbag(val[i],val[i],vol[i]);
        }
        int ans=0;
        for(int i=1;i<=m;i++)
        {
            if(dp[i]==i)
            ans++;
        }
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(HDU 2844 coins)