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;

}

你可能感兴趣的:(mac)