现在的位置: 首页 > 综合 > 正文

hdu2844 多重背包

2012年10月06日 ⁄ 综合 ⁄ 共 704字 ⁄ 字号 评论关闭

http://acm.hdu.edu.cn/showproblem.php?pid=2844

#include <stdio.h>
#include <string.h>
int w[105];
int num[105];
int m;
int dp[100005];
int max(int a,int b)
{
    return a>b?a:b;
}
void ZeroOnePack(int v,int c)
{
    int i;
    for(i=m;i>=c;i--)
        dp[i]=max(dp[i],dp[i-c]+v);
}
void CompletePack(int v,int c)
{
    int i;
    for(i=c;i<=m;i++)
        dp[i]=max(dp[i],dp[i-c]+v);
}
int main()
{
    int n;
    while(scanf("%d%d",&n,&m),n+m)
    {
        int i;
        memset(dp,0,sizeof(dp));
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&num[i]);
        for(i=1;i<=n;i++)
        {
            if(num[i]*w[i]>m)
                CompletePack(w[i],w[i]);
            else
            {
                int k=1;
                while(k<=num[i])
                {
                    ZeroOnePack(k*w[i],k*w[i]);
                    num[i]=num[i]-k;
                    k=k<<1;
                }
                ZeroOnePack(num[i]*w[i],num[i]*w[i]);
            }
        }
        int s=0;
        for(i=1;i<=m;i++)
        {
            if(dp[i]==i)
                s++;
        }
        printf("%d\n",s);
    }
    return 0;
}

抱歉!评论已关闭.