背包,注意更新从大到小
#include<bits/stdc++.h>
using namespace std;
#define fst first
#define sec second
#define sci(num) scanf("%d",&num)
#define scl(num) scanf("%lld",&num)
#define mem(a,b) memset(a,b,sizeof a)
#define cpy(a,b) memcopy(a,b,sizeof b)
typedef long long LL;
typedef pair<int,int> pair;
const int MAX_M = 100010;
const int MAX_N = 110;
bool vis[MAX_M];
int a[MAX_N],c[MAX_N];
int n,m;
int main() {
while (~sci(n),~sci(m) ) {
if (n == 0) break;
mem(vis,0);
vis[0] = true;
for (int i = 1;i <= n;i++)
sci(a[i]);
for (int i = 1;i <= n;i++)
sci(c[i]);
for (int i = 1;i <= n;i++) {
int k = 1;
int temp;
while (k <= c[i]) {
c[i] -= k;
temp = k * a[i];
for (int j = m;j >= temp;j--) {
vis[j] = vis[j] || vis[j - temp];
}
k = k << 1;
}
if (c[i] > 0) {
k = c[i];
temp = k * a[i];
for (int j = m;j >= temp;j--)
vis[j] = vis[j] || vis[j - temp];
}
}
int cnt = 0;
for (int i = 1; i <= m;i++)
if (vis[i] ) cnt++;
printf("%d\n",cnt);
}
return 0;
}