[Poj 1276] Cash Machine

来源:互联网 发布:sqlserver declare 编辑:程序博客网 时间:2024/06/05 17:02

Problem:
给定总钱数n,钞票数m,以及每张钞票的张数ci和面额wi,求能组成的面额小于等于n的最大面额。
Solution:
多重背包,二进制分组。

#include <stdio.h>#include <string.h>#define max(a,b) ((a)>(b)?(a):(b))int n,m,c[1001],w[1001],f[100001];int main(){    while(~scanf("%d",&n))    {        memset(f,0,sizeof(f));        scanf("%d",&m);        for(int i=1; i<=m; i++)            scanf("%d%d",&c[i],&w[i]);        for(int i=1; i<=m; i++)        {            int k, t;            k = 1;            t = c[i];            while(t > k)            {                for(int j = n; j >= w[i]*k; j--)                    f[j] = max(f[j],f[j-w[i]*k]+w[i]*k);                t -= k;                k *= 2;            }            for(int j = n; j >= w[i]*t; j--)                f[j] = max(f[j],f[j-w[i]*t]+w[i]*t);        }        printf("%d\n",f[n]);    }    return 0;} 
0 0