裸的多重背包模板,需要二进制优化才能不超时 0.0
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>
using namespace std;
//#define memset(a,b,sizeof a) cir(a,b)
const int maxn = 100000+10;
int v[maxn],w[maxn];
int n,m;
int dp[maxn];
void ZeroOnePack(int v,int w)
{
for(int i=m;i>=w;i--)
{
dp[i] = max(dp[i],dp[i-v]+v);
}
}
void AllPack(int v,int w)
{
for(int i=w;i<=m;i++)
{
dp[i] = max(dp[i],dp[i-v]+v);
}
}
void MultPack(int v,int w,int number)
{
if(number * w >= m)
{
AllPack(v,w);
}
else
{
int k=1;
while(k<=number)
{
ZeroOnePack(k*v,k*w);
number -= k;
k *= 2;
}
ZeroOnePack(number*v,number*v);
}
}
map<int,int> Map;
int main()
{
while(scanf("%d%d",&n,&m)!=EOF && (n&&m))
{
//cir(v,0),cir(w,0);
// Map.clear();
memset(v,0,sizeof(v));
memset(w,0,sizeof(w));
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++)
{
scanf("%d",&v[i]);
}
for(int i=0;i<n;i++)
{
scanf("%d",&w[i]);
}
for(int i=0;i<n;i++)
{
MultPack(v[i],v[i],w[i]);
}
int sum = 0;
for(int i=1;i<=m;i++)
{
if(dp[i]>=i) sum++;
}
cout << sum <<endl;
}
return 0;
}