背包专题:http://www.cnblogs.com/qq188380780/p/6409474.html
//多重背包
#include<cstdio>
int b[],a[][];
int Room,ans; void init()
{
b[] = ;
for(int i=; i<=Room; ++i)
b[i] = ;
ans = ;
} void zero_one_bag(int v)
{
for(int i=Room; i>=v; --i)
if(!b[i] && b[i-v])
{
++ans;
b[i] = ;
}
} void complete_bag(int v)
{
for(int i=v; i<=Room; ++i)
if(!b[i] && b[i-v])
{
++ans;
b[i] = ;
}
} void multiple_bag(int v,int n)
{
if(n*v >= Room)
complete_bag(v);
else
for(int i=; i<n; i*=)
{
zero_one_bag(i*v);
n -= i;
}
zero_one_bag(n*v);
} int main()
{
int n,s;
while(~scanf("%d%d",&n,&Room) && n+Room)
{
for(int i=; i<; ++i)
for(int j=; j<n; ++j)
scanf("%d",&a[j][i]);
init();
for(int i=; i<n; ++i)
multiple_bag(a[i][],a[i][]);
printf("%d\n",ans);
}
return ;
}