O(n*m)复杂度的多重背包coinsPOJ 1742
思路是把物品看成是无限的,就像做完全背包一样从小到大更新,而事实上每种物品的数量却是有限的,所以还必须用count[j]记录当拼成j面值时用了多少个面值为ai的硬币,当在考虑面值k能否拼成时,如果count[k-ai]时已经用掉了re个ai面值的硬币了,如果re >= 该面值硬币的数量了,面值k就不能拼成,因为没这么多硬币了,如果小于该面值硬币的数量,面值 k能拼成,且count[k]为count[k-ai]+1.
View Code
1 #include <cstdio> 2 #include <cstring> 3 bool v[100010]; 4 int count[100010]; 5 int main() 6 { 7 int n,m; 8 int a[120],c[120]; 9 while(~scanf("%d%d",&n,&m)) 10 { 11 memset(v,false,sizeof(v)); 12 v[0] = true; 13 if(n==0 && m==0) break; 14 for(int i=0; i<n; i++) 15 scanf("%d",&a[i]); 16 for(int i=0; i<n; i++) 17 scanf("%d",&c[i]); 18 int cnt = 0; 19 for(int i=0; i<n; i++) 20 { 21 memset(count,0,sizeof(count)); 22 for(int j = a[i]; j<= m ; j++) 23 { 24 if(!v[j] && v[j-a[i]] && count[j-a[i]]<c[i]) 25 { 26 cnt++; 27 count[j] = count[j-a[i]] +1; 28 v[j] = true; 29 } 30 } 31 } 32 printf("%d\n",cnt); 33 } 34 return 0; 35 }
还有一种方法是单调队列优化,这是楼天成教主的男人八题中说的方法,同余类优化什么的,2009年国家集训队论文,由徐持衡写的《浅谈几类背包题》中也有提及,我暂时还不理解无能,谁会的话告诉我啊````