主要是记录一下对于背包问题的二进制优化方法
1.多重背包使用二进制优化后转化为01背包问题
#include <iostream>
#include <cstdio>
#include <queue>
#include <vector>
#include <algorithm>
#include <string>
#include <bitset>
#include <map>
#include <cstring>
using namespace std;
int dp[100005];
int main()
{
int W;
while(scanf("%d",&W) != EOF)
{
memset(dp, 0, sizeof(dp));
int n;
scanf("%d", &n);
for(int i = 0; i < n; ++i)
{
int v, c;
scanf("%d%d", &c, &v);
int a = 1;
while(c > a)
{
c -= a;
for(int j = W; j >= a * v; --j)
dp[j] = max(dp[j], dp[j - a * v] + a * v);
a *= 2;
}
for(int j = W; j >= c * v; --j)
dp[j] =