《动态规划》hdoj 2844 多重背包+二进制优化

#include<stdio.h>
int c[105],a[105],dp[100005];
int n,m;
int pack01(int value)
{
    int i;
    for(i=m;i>=value;i--)
        if(dp[i-value])
            dp[i]=1;
}
int completeoack(int value)
{
    int i;
    for(i=value;i<=m;i++)
        if(dp[i-value])
            dp[i]=1;
}
int mutiplepack(int value,int num)
{
    if(value*num>=m)
        completeoack(value);
    else
    {
        int k=1;
        while(k<num)
        {
            pack01(k*value);
            num-=k;
            k*=2;
        }
        pack01(num*value);
    }
}
int main()
{


    while(~scanf("%d %d",&n,&m),n+m)
    {
        int i,ans;
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(i=1;i<=n;i++)
        {
            scanf("%d",&a[i]);
        }
        for(i=1;i<=n;i++)
        {
            scanf("%d",&c[i]);
        }
        for(i=1;i<=n;i++)
            mutiplepack(a[i],c[i]);
        ans=0;
        for(i=1;i<=m;i++)
            if(dp[i]) ans++;
        printf("%d\n",ans);
    }
    return 0;
}

你可能感兴趣的:(《动态规划》hdoj 2844 多重背包+二进制优化)