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

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

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


pku 1276 Cash Machine 多重背包_iospku 1276 Cash Machine 多重背包_#include_02View 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;
}