POJ 1276 Cash Machine

来源:互联网 发布:淘宝 大麦网 编辑:程序博客网 时间:2024/04/30 21:29

多重背包

#include <iostream>#include <cstring>#include <cstdio>#include <algorithm>const int maxn = 100010;using namespace std;int c[maxn],v[maxn],dp[maxn],n1[maxn],V;void ZeroOnepack(int c,int v)//01背包{    for(int i = V ; i >= c ; i--)        dp[i] = max(dp[i],dp[i-c]+v);}void CompletePack(int c, int v)//完全背包{    for(int i = c ; i <= V ; i++)        dp[i] = max(dp[i],dp[i-c]+v);}void MultiplePack(int c,int v,int n1)//多重背包{    if(c*n1>=V)    {        CompletePack(c,v);        return ;    }    else    {        int k = 1 ;        while (k <= n1)        {            ZeroOnepack(c*k,v*k);            n1 -= k;            k <<= 1;        }        ZeroOnepack(c*n1,v*n1);    }}int main(){    int n ;    while(~scanf("%d%d",&V,&n))    {        if(n == 0) printf("0\n");        else        {            for(int i = 0 ; i < n ; i++)            {                scanf("%d%d",&n1[i],&c[i]);                v[i] = c[i];            }            if(V == 0) printf("0\n");            else            {                memset(dp,0,sizeof(dp));                for(int i = 0 ; i < n ; i++)                {                    MultiplePack(c[i],v[i],n1[i]);                }                printf("%d\n",dp[V]);            }        }    }    return 0;}
0 0