http://poj.org/problem?id=1276
才开始自己写了一下转换成01背包的做法,直接tle。。计算一下就知道会tle了。
然后写了一下二进制思想的方法,终于A了。。。背包好久没看了,自己还是不是很扎实啊
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#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; }