背包专题:http://www.cnblogs.com/qq188380780/p/6409474.html
1 //多重背包 2 #include<cstdio> 3 int b[100005],a[100005][2]; 4 int Room,ans; 5 6 void init() 7 { 8 b[0] = 1; 9 for(int i=1; i<=Room; ++i) 10 b[i] = 0; 11 ans = 0; 12 } 13 14 void zero_one_bag(int v) 15 { 16 for(int i=Room; i>=v; --i) 17 if(!b[i] && b[i-v]) 18 { 19 ++ans; 20 b[i] = 1; 21 } 22 } 23 24 void complete_bag(int v) 25 { 26 for(int i=v; i<=Room; ++i) 27 if(!b[i] && b[i-v]) 28 { 29 ++ans; 30 b[i] = 1; 31 } 32 } 33 34 void multiple_bag(int v,int n) 35 { 36 if(n*v >= Room) 37 complete_bag(v); 38 else 39 for(int i=1; i<n; i*=2) 40 { 41 zero_one_bag(i*v); 42 n -= i; 43 } 44 zero_one_bag(n*v); 45 } 46 47 int main() 48 { 49 int n,s; 50 while(~scanf("%d%d",&n,&Room) && n+Room) 51 { 52 for(int i=0; i<2; ++i) 53 for(int j=0; j<n; ++j) 54 scanf("%d",&a[j][i]); 55 init(); 56 for(int i=0; i<n; ++i) 57 multiple_bag(a[i][0],a[i][1]); 58 printf("%d ",ans); 59 } 60 return 0; 61 }