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

  • 相关阅读:
    Python 集合
    Python 文字列
    JUNIT5(maven配置)
    Javascript严格模式
    移动互联测试
    Python的基础知识
    Linux系统下发件oa环境
    禅道的使用
    Linux系统的安装过程
    Oracle基础知识
  • 原文地址:https://www.cnblogs.com/allh123/p/2989226.html
Copyright © 2011-2022 走看看