pku 1276 Cash Machine 多重背包

http://poj.org/problem?id=1276

才开始自己写了一下转换成01背包的做法,直接tle。。计算一下就知道会tle了。

然后写了一下二进制思想的方法,终于A了。。。背包好久没看了,自己还是不是很扎实啊

View Code
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 100007
#define N 11
using namespace std;

int f[maxn];
int c[N],b[N];
int V,n,m;
void zb(int c,int w,int v)
{
    for (int i = v; i >= c; --i)
    f[i] = max(f[i],f[i - c] + w);
}
void cm(int c,int w,int v)
{
    for (int i = c; i <= v; ++i)
    f[i] = max(f[i],f[i - c] + w);
}
int main()
{
    int i;
    while (~scanf("%d",&V))
    {
        scanf("%d",&n);
        for (i = 0; i < n; ++i)
        scanf("%d%d",&b[i],&c[i]);
        memset(f,0,sizeof(f));
        for (i = 0; i < n; ++i)
        {
            if (b[i]*c[i] > V)
            cm(c[i],c[i],V);
            else
            {
                int k = 1;
                while (k < b[i])
                {
                    zb(k*c[i],k*c[i],V);
                    b[i] -= k;
                    k*=2;
                }
                zb(b[i]*c[i],b[i]*c[i],V);
            }
        }
        printf("%d\n",f[V]);
    }
    return 0;
}
posted @ 2012-04-26 23:22  E_star  阅读(180)  评论(0编辑  收藏  举报