这道题是典型的多重背包的题目,也是最基础的多重背包的题目

题目大意:给定n和m, 其中n为有多少中钱币, m为背包的容量,让你求出在1 - m 之间有多少种价钱的组合,由于这道题价值和重量相等,所以就是dp[i] = i, 其中dp[i]表示当前背包容量为i 的时候背包能装的价值。

题目思路: 模板 二进制优化

话说那个二进制真的很奇妙,只需要2的1次方 到 2的k-1次方, 到最后在加上一项当前项的个数 - 2 的k次方 + 1,也就是这些系数分别为1; 2; 22 .....2k-1;Mi - 2k + 1,且k是满足Mi - 2k + 1 > 0的最大整数, 就能表示出所有1 - Mi之间的所有系数,好强大~

代码如下:

  1. #include<iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int MAX = ;
  6. int dp[MAX];
  7. int c[MAX], w[MAX];
  8. int v;
  9.  
  10. void ZeroOnePack(int cost, int wei)
  11. {
  12. for (int i = v; i >= cost; i--)
  13. dp[i] = max(dp[i], dp[i - cost] + wei);
  14. }
  15.  
  16. void CompletePack(int cost, int wei)
  17. {
  18. for (int i = cost; i <= v; i++)
  19. dp[i] = max(dp[i], dp[i - cost] + wei);
  20. }
  21.  
  22. void MultiPack(int cost, int wei, int cnt)
  23. {
  24. if (v <= cnt * cost)//如果个数*重量大于背包容量了,直接完全背包
  25. {
  26. CompletePack(cost, wei);
  27. }
  28. else
  29. {
  30. int k = ;
  31. while (k <= cnt)
  32. {
  33. ZeroOnePack(k *cost, k * wei);
  34. cnt = cnt - k;
  35. k = * k;
  36. }
  37. ZeroOnePack(cnt * cost, cnt * wei);
  38. }
  39. }
  40.  
  41. int main()
  42. {
  43.  
  44. int n;
  45. while (~scanf("%d %d", &n, &v), n + v)
  46. {
  47. for (int i = ; i < n; i++)
  48. scanf("%d", &c[i]);
  49. for (int i = ; i < n; i++)
  50. scanf("%d", &w[i]);
  51. memset(dp, , sizeof(dp));
  52. for (int i = ; i< n; i++)
  53. {
  54. MultiPack(c[i], c[i], w[i]);
  55.  
  56. }
  57. int sum = ;
  58. for (int i = ; i <= v; i++)
  59. if (dp[i] == i)
  60. sum++;
  61. printf("%d\n", sum);
  62.  
  63. }
  64.  
  65. return ;
  66. }

HDu -2844 Coins多重背包的更多相关文章

  1. hdu 2844 Coins (多重背包+二进制优化)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 思路:多重背包 , dp[i] ,容量为i的背包最多能凑到多少容量,如果dp[i] = i,那么代表 ...

  2. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  3. HDU 2844 Coins (多重背包计数 空间换时间)

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  4. hdu 2844 coins(多重背包 二进制拆分法)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  5. hdu 2844 Coins 多重背包(模板) *

    Coins                                                                             Time Limit: 2000/1 ...

  6. HDU 2844 Coin 多重背包

    Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  7. 背包系列练习及总结(hud 2602 && hdu 2844 Coins && hdu 2159 && poj 1170 Shopping Offers && hdu 3092 Least common multiple && poj 1015 Jury Compromise)

    作为一个oier,以及大学acm党背包是必不可少的一部分.好久没做背包类动规了.久违地练习下-.- dd__engi的背包九讲:http://love-oriented.com/pack/ 鸣谢htt ...

  8. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  9. POJ 3260 The Fewest Coins(多重背包+全然背包)

    POJ 3260 The Fewest Coins(多重背包+全然背包) http://poj.org/problem?id=3260 题意: John要去买价值为m的商品. 如今的货币系统有n种货币 ...

随机推荐

  1. C++变量的“总分性”(Mereology)

    Stroustrup 在自传中说自己在哲学上深受 Kierkegaard (吉爾凱高爾)的影响,而讨厌黑格尔.所以看 Stroustrup 的书,很少感受到抽象理论的重要性.这也影响了C++的文化:许 ...

  2. openstack VM可以ping外部网络,但是外部网络ping不通VM

    经过无数次的尝试,终于搭建好了完整的Openstack,本来VM可以获取到IP地址,但是等到我大功告成的时候,突然发现外部网络却不能ping进VM,我可是整整折腾了我几个通宵,这是哭啊.然而,皇天不负 ...

  3. jquery实现页面置顶功能代码

    <html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...

  4. Html5 Canvas学习

    canvas: 首先在html页面中加入canvas标签 <canvas id="canvas" width="1024" height="74 ...

  5. phpstorm配置xdebug

    首先配置好xdebug 在php.ini里面加入以下配置(修改完注意重启apache或nginx): [xdebug] zend_extension="/usr/local/opt/php5 ...

  6. 转:Hprose for php(二)——服务器

    文章来自于:http://blog.csdn.net/half1/article/details/21252879 本文将介绍Hprose for php服务器的更多细节 1.发布服务 Hprose提 ...

  7. VS中的预先生成事件和后期生成事件

    原文:VS中的预先生成事件和后期生成事件 在C#开发中,有时候需要在程序编译之前或之后做一些操作. 要达到这个目的,可以使用Visual Studio中的预先生成事件和后期生成事件. 下图是一个简单例 ...

  8. perl /m

    <pre name="code" class="html">[root@backoffice01 ~]# cat a1.pl my $_=" ...

  9. lr11 录制脚本时候,无法自动启动ie,查了网上很多方法都未解决?

    解决办法是把杀毒软件.防火墙都关闭,再重新运行一次,就可以了

  10. Java学习日记 集合

    一.接口Map<K,V>1.V put(K key, V value)2.int size()3.public class HashMap<K, V> implements M ...