hdu 2844 Coins(dp 多重背包)

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
struct Coin{
  int v,c;
};
Coin coin[200];
int dp[100000+100];
int main()
{
    int t,n,m;
    int p,h,c;
    int i,j,k;
    while(scanf("%d%d",&n,&m),n+m)
    {
        for(i=0;i<n;i++)
        {
          scanf("%d",&coin[i].v);
        }
        for(i=0;i<n;i++)
        {
            scanf("%d",&coin[i].c);
        }
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        for(i=0;i<n;i++)
        {
            int tot=coin[i].c;
            for(j=1;j<=tot;j*=2)
            {
                tot-=j;
                for(k=m;k>=j*coin[i].v;k--)
                {
                    if(dp[k-j*coin[i].v]==1) dp[k]=1;
                }
            }
            if(tot!=0)
            {
               for(k=m;k>=tot*coin[i].v;k--)
                {
                    if(dp[k-tot*coin[i].v]==1) dp[k]=1;
                }
            }
        }
        int ans=0;
        for(i=1;i<=m;i++)
        {
            if(dp[i]==1) ans++;
        }
        printf("%d
",ans);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/sola1994/p/4685998.html