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年国家集训队论文,由徐持衡写的《浅谈几类背包题》中也有提及,我暂时还不理解无能,谁会的话告诉我啊````

 

posted on 2013-03-29 17:04  allh123  阅读(202)  评论(0编辑  收藏  举报

导航