POJ1742 coins

来源:互联网 发布:java的socket编程 编辑:程序博客网 时间:2024/05/22 15:25

多重背包

f[i]代表价值为i的有没有被发现

used[value]代表,价值为value的时候第i枚硬币用了几个

#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#include <cmath>#include <algorithm>#define SCAND(x) scanf("%d",&(x))#define SCANS(x) scanf("%s",(x))#define PRINTD(x) printf("%d",(x))using namespace std;const int INF=1<<30;int w[111],c[111],used[111111],f[111111];void memall(){    memset(w,0,sizeof(w));    memset(c,0,sizeof(c));    memset(used,0,sizeof(used));    memset(f,0,sizeof(f));}int main(){    #ifndef ONLINE_JUDGE        freopen("H:/in.txt","r",stdin);        //freopen("H:/out.txt","w",stdout);    #endif    int n,m;    while(scanf("%d%d",&n,&m))    {        if(n==0&&m==0)            break;        memall();        for(int i=0;i<n;i++)            SCAND(w[i]);        for(int i=0;i<n;i++)            SCAND(c[i]);        f[0]=1;        int sum=0;        for(int i=0;i<n;i++)        {            memset(used,0,sizeof(used));            for(int j=w[i];j<=m;j++)            {                if(!f[j]&&f[j-w[i]]&&used[j-w[i]]+1<=c[i])                {                    f[j]=1;                    used[j]=used[j-w[i]]+1;                    sum++;                }            }        }        cout<<sum<<endl;    }}


0 0