题目:http://acm.hdu.edu.cn/showproblem.php?pid=2844
垃圾题,写这么长时间
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
const int maxn=100005;
bool dp[maxn];
int w[105],num[105],nw[10010];
int main(){
int n,m;
while(scanf("%d%d",&n,&m)&&n+m){
if(m<=0&&n==0){
cout<<0<<endl;
continue;
}
memset(dp,0,sizeof(dp));
memset(nw,0,sizeof(nw));
for(int i=1;i<=n;i++)
scanf("%d",&w[i]);
int cnt0=1;
for(int i=1;i<=n;i++){
scanf("%d",&num[i]);
for(int j=1;j<=num[i];j<<=1){
nw[cnt0++]=j*w[i];
num[i]-=j;
}
if(num[i]>0)
nw[cnt0++]=num[i]*w[i];
}
int ans=0;
dp[0]=1;
for(int i=1;i<=cnt0;i++)
for(int j=m;j>=nw[i];j--)
if(dp[j-nw[i]])
dp[j]=true;
for(int i=1;i<=m;i++)
if(dp[i])ans++;
cout<<ans<<endl;
}
return 0;
}