如果没有多重背包没有那个if,也就是不考虑完全背包,全部当成01背包时间,时间会翻倍。
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<vector>
#include<algorithm>
#include<iostream>
#include<time.h>
using namespace std;
int dp[100005];
int a[100005];
int c[100005];
int n, m;
int i, j, k;
void ZeroOne(int value,int weight)
{
for (k = m; k >=value; k--)
dp[k] = max(dp[k], dp[k -value] + weight);
}
void Complete()
{
for (j = a[i]; j <= m; j++)
dp[j] = max(dp[j], dp[j - a[i]] + a[i]);
}
void Multiply()
{
if (c[i] * a[i] > m)
{
Complete();
}
else
{
for (j = 1; j <= c[i]; j <<= 1)
{
c[i] -= j;
ZeroOne(j*a[i], j*a[i]);
}
ZeroOne(c[i] * a[i], c[i] * a[i]);
}
}
int vs_main()
{
while (cin >> n >> m, n + m)
{
memset(dp, 0, sizeof(dp));
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
for (i = 1; i <= n; i++)
{
cin >> a[i];
}
for (i = 1; i <= n; i++)
{
cin >> c[i];
}
for (i = 1; i <= n; i++)
{
Multiply();
}
int count = 0;
for (i = 1; i <= m; i++)
if (dp[i] == i)
count++;
cout << count << endl;
}
return 0;
}