hdu 2844 Coins (多重背包)

来源:互联网 发布:财政部会计报表软件 编辑:程序博客网 时间:2024/05/16 14:30
/*题意 :给你一些不同价值和一定数量的硬币,求用这些硬币可以组合成价值在[1 , m]之间的有多少dp[i]来表示容量为i这个包包可以装多少价值,最后计数是要计价值和容量相等的个数*/# include<stdio.h># include<algorithm># include<string.h>using namespace std;int sum,dp[100010];void CompletePack(int v){    for(int i=v; i<=sum; i++)    {        dp[i]=max(dp[i],dp[i-v]+v);    }}void ZeroOnePack(int v){    for(int i=sum; i>=v; i--)        dp[i]=max(dp[i],dp[i-v]+v);}void MultiplePack(int v,int num){    if(v*num>=sum)    {        CompletePack(v);        return ;    }    int k=1;    while(k<num)    {        ZeroOnePack(k*v);        num-=k;        k*=2;    }    ZeroOnePack(num*v);}int main(){    int n,m,i;    int v[110],num[110];    while(~scanf("%d%d",&n,&m),n+m)    {        for(i=0; i<n; i++)        {            scanf("%d",&v[i]);        }        for(i=0; i<n; i++)        {            scanf("%d",&num[i]);        }        sum=m;        memset(dp,0,sizeof(dp));        for(i=0; i<n; i++)        {            MultiplePack(v[i],num[i]);        }        int count=0;        for(i=1; i<=sum; i++)        {            if(dp[i]==i)                count++;        }        printf("%d\n",count);    }    return 0;}



/*poj 1742 */# include<stdio.h># include<algorithm># include<string.h>using namespace std;int sum;bool dp[100010];int max1(int a,int b){    return a>b;}void CompletePack(int v){    for(int i=v; i<=sum; i++)    {        dp[i]=dp[i]|dp[i-v];    }}void ZeroOnePack(int v){    for(int i=sum; i>=v; i--)        dp[i]=dp[i]|dp[i-v];}void MultiplePack(int v,int num){    if(v*num>=sum)    {        CompletePack(v);        return ;    }    int k=1;    while(k<num)    {        ZeroOnePack(k*v);        num-=k;        k*=2;    }    ZeroOnePack(num*v);}int main(){    int n,m,i;    int v[110],num[110];    while(~scanf("%d%d",&n,&m),n+m)    {        for(i=0; i<n; i++)        {            scanf("%d",&v[i]);        }        for(i=0; i<n; i++)        {            scanf("%d",&num[i]);        }        sum=m;        memset(dp,0,sizeof(dp));        dp[0]=1;        for(i=0; i<n; i++)        {            MultiplePack(v[i],num[i]);        }        int count=0;        for(i=1; i<=sum; i++)        {            if(dp[i])                count++;        }        printf("%d\n",count);    }    return 0;}


0 0