POJ 1742 Coins 多重背包入门题

题意:给你钱的价值和数量,求能在价值m以内能够拼出多少种钱数。

View Code
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
bool dp[120003];
int w[101],c[101];
int main()
{
    int n, m, i, j;
    while(~scanf("%d%d",&n,&m))
    {
        if(!m&&!n)break;
        for(i=1;i<=n;i++)
            scanf("%d",&w[i]);
        for(i=1;i<=n;i++)
            scanf("%d",&c[i]);
        memset(dp,0,sizeof(dp));
        dp[0]=1;
        //多重背包
        for(i=1;i<=n;i++)
        {
            if(c[i]*w[i]>=m)
            {
                for(j=w[i];j<=m;j++)
                    if(dp[j-w[i]])dp[j]=1;
            }
            else
            {
                int k=1;
                while(k<c[i])
                {
                    for(j=m;j>=w[i]*k;j--)
                        if(dp[j-w[i]*k])dp[j]=1;
                    c[i] -= k;
                    k*=2;
                }
                for(j=m;j>=w[i]*c[i];j--)
                    if(dp[j-w[i]*c[i]])dp[j]=1;
            }
        }
        int num=0;
        for(i=1;i<=m;i++)
            if(dp[i])num++;
        printf("%d\n",num);
    }
    return 0;
}

 

posted @ 2012-08-14 09:51  To be an ACMan  Views(189)  Comments(0)    收藏  举报