意甲冠军:你有N种硬币,每个价格值A[i],每个号码C[i],要求。

在不超过M如果是,我们用这些硬币,有多少种付款的情况下,。那是,:1,2,3,4,5,....,M这么多的情况下,,你可以用你的硬币不找零,种情况。

比如:

你有一种硬币,价值2。个数2,那么 你是不能付款 3元的。。你仅仅能付款2,或者4元。。

OK,题意差点儿相同就是这样啦。

那么这里有两种方式!

分析:

那么这里我们能够用多重背包来解决,我们把价值和重量看成一样的w[i] = A[i];用M作为背包。

那么dp 过后。我们就能够知道 dp[i] 表示的含义为,不超过i元钱的情况下,用拥有的硬币能构成的最大钱数。那么非常明显,假设dp[i] = i,意思就是 用拥有的钱,能够刚好构成 i 元钱,上马:

  1. //281MS 648K
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. #define MAX 102
  6.  
  7. int ans;//最后答案
  8. int n,m;
  9. int A[MAX],C[MAX];
  10. int dp[100005];
  11.  
  12. void ZeroOne(int V,int W)
  13. {
  14. for(int i = m; i >= V; i--)
  15. //dp[i] = dp[i]>dp[i-V]+W ?
  16.  
  17. dp[i]:dp[i-V]+W;
  18. if(dp[i]<dp[i-V]+W)
  19. {
  20. dp[i] = dp[i-V]+W;//这里需改动如此统计
  21. if(dp[i] == i) ans ++;//在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后
  22. }
  23. }
  24.  
  25. int main()
  26. {
  27. while(scanf("%d%d",&n,&m),n+m)
  28. {
  29. ans = 0;
  30. memset(dp,0,sizeof(dp));
  31. for(int i = 1; i <= n; i ++) scanf("%d",&A[i]);
  32. for(int i = 1; i <= n; i ++) scanf("%d",&C[i]);
  33.  
  34. for(int i = 1; i <= n; i ++)
  35. {
  36. if(A[i]*C[i] >= m)
  37. {
  38. for(int j = A[i]; j <= m; j ++)
  39. //dp[j] = dp[j]>dp[j-A[i]]+A[i] ? dp[j]:dp[j-A[i]]+A[i]; //将价值和重量看做同样
  40. if(dp[j]<dp[j-A[i]]+A[i]) //这里需改动如此统计ans
  41. {
  42. dp[j] = dp[j-A[i]]+A[i];
  43. if(dp[j] == j) ans ++; //在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后
  44. }
  45. }
  46. else
  47. {
  48. int k = 1;
  49. while(k <= C[i])
  50. {
  51. ZeroOne(A[i]*k,A[i]*k);
  52. C[i] -= k;
  53. k *= 2;
  54. }
  55. ZeroOne(C[i]*A[i],C[i]*A[i]);
  56. }
  57. }
  58. //for(int i = 1; i <= m; i ++) if(dp[i]==i)ans++;//这里用以用在hdu,可是poj须要用上面的方式统计ans,不然会超时,过了也过得非常险 2654ms........汗。。
  59.  
  60. 。。
  61.  
  62.  
  63. printf("%d\n",ans);
  64. }
  65. return 0;
  66. }

那么这里另一种方式

用flag[i]表示能不能构成 钱为 i 的情况

time[j] 表示,构成 j 元钱的时候,用第 i 种硬币的个数

  1. #include <iostream>
  2. #include <cstring>
  3. using namespace std;
  4.  
  5. #define MAX 100005
  6.  
  7. int N,M;
  8. int A[MAX],C[MAX];
  9. bool flag[MAX];
  10. int time[MAX];
  11.  
  12. int main()
  13. {
  14. while(cin >> N >> M)
  15. {
  16. if(!N && !M)break;
  17. for(int i = 0; i < N; i ++) cin >> A[i];
  18. for(int i = 0; i < N; i ++) cin >> C[i];
  19.  
  20. int ans = 0;
  21. memset(flag,false,sizeof(flag));
  22. flag[0] = true;
  23. for(int i = 0; i < N; i ++){
  24. memset(time,0,sizeof(time));
  25. for(int j = A[i]; j <= M; j ++){//这里解释为。仅仅有当前j这样的情况没有构成,而且j-A[i]的情况存在--(这里也就是相似全然背包,这次状态应该依赖前面存在情况),同一时候到j为止。用第i种硬币的数量不超过C[i]的情况下才满足条件
  26. if(!flag[j] && flag[j-A[i]] && time[j-A[i]]+1 <= C[i]){
  27. flag[j] = true;
  28. time[j] = time[j-A[i]]+1;
  29. ans ++;
  30. }
  31. }
  32. }
  33. cout << ans <<endl;
  34. }
  35. return 0;
  36. }

个人愚昧观点,欢迎指正与讨论

版权声明:本文博主原创文章,博客,未经同意不得转载。

hdu2844 &amp; poj1742 Coin ---多重背包--两种方法的更多相关文章

  1. windows下获取IP地址的两种方法

    windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...

  2. android 之 启动画面的两种方法

    现在,当我们打开任意的一个app时,其中的大部分都会显示一个启动界面,展示本公司的logo和当前的版本,有的则直接把广告放到了上面.启动画面的可以分为两种设置方式:一种是两个Activity实现,和一 ...

  3. [转载]C#读写txt文件的两种方法介绍

    C#读写txt文件的两种方法介绍 by 大龙哥 1.添加命名空间 System.IO; System.Text; 2.文件的读取 (1).使用FileStream类进行文件的读取,并将它转换成char ...

  4. php如何防止图片盗用/盗链的两种方法(转)

    图片防盗链有什么用? 防止其它网站盗用你的图片,浪费你宝贵的流量.本文章向大家介绍php防止图片盗用/盗链的两种方法 Apache图片重定向方法 设置images目录不充许http访问 Apache服 ...

  5. WPF程序将DLL嵌入到EXE的两种方法

    WPF程序将DLL嵌入到EXE的两种方法 这一篇可以看作是<Visual Studio 版本转换工具WPF版开源了>的续,关于<Visual Studio 版本转换工具WPF版开源了 ...

  6. MongoDB实现分页(两种方法)

    1.插入实验数据 偷懒用下samus,100条. ; i < ; i++) { Document doc = new Document(); doc["ID"] = i; d ...

  7. css:图标与文字对齐的两种方法

    (好久没写博客了,这几个月的积累比较零碎,记在本子上,现在开始整理归类) 在平时写页面的过程中,常遇到要把小图标与文字对齐的情况.比如: 总结了两种方法,代码量都比较少. 第一种 对img设置竖直方向 ...

  8. .net中创建xml文件的两种方法

    .net中创建xml文件的两种方法 方法1:根据xml结构一步一步构建xml文档,保存文件(动态方式) 方法2:直接加载xml结构,保存文件(固定方式) 方法1:动态创建xml文档 根据传递的值,构建 ...

  9. 两种方法设置disabled属性

    //两种方法设置disabled属性 $('#fileup').attr("disabled",true); $('#fileup').attr("disabled&qu ...

随机推荐

  1. AES加密 C++调用Crypto++加密库 样例

    这阵子写了一些数据加密的小程序,对照了好几种算法后,选择了AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES).听这名字就非常厉害的样子 预计会搜索到这 ...

  2. hdu4771 Stealing Harry Potter&#39;s Precious

    注意--你可能会爆内存-- 假设一个直接爆搜索词-- 队列存储器元件被减少到-- #include<iostream> #include<map> #include<st ...

  3. hdu3530Subsequence rmq

    //使用rmq办,ma[i][j],同i作为一个起点2^j阵列的最大长度值 //启动枚举问最长的子列 //枚举的最大长度2^(j-1)和2^(j)z之间 //然后在该范围内找到 #include< ...

  4. _00013 一致性哈希算法 Consistent Hashing 新的讨论,并出现相应的解决

    笔者博文:妳那伊抹微笑 博客地址:http://blog.csdn.net/u012185296 个性签名:世界上最遥远的距离不是天涯,也不是海角,而是我站在妳的面前.妳却感觉不到我的存在 技术方向: ...

  5. Android架构分析之LOG模块

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz Android版本:2.3.7_r1 Linux内核版本:android-goldfish-2.6.29 Andro ...

  6. 邮箱password复位图

    blog宗旨:用图说话 辅助文字说明: 长处:用户系统完毕接口部分.界面留给业务自行设计. 缺点:邮箱发送邮件定制模板,没有完毕松耦合. 改进点:邮箱的准备发送邮件模板. 版权声明:本文博客原创文章, ...

  7. 自动同步Android源代码的脚本(repo sync)

    #!/bin/bash echo "================start repo sync====================" repo sync -j5 ]; do ...

  8. Linux下一个OTL 采用long long类型数据库支持BIGINT

    码如下面: #define OTL_BIGINT long long #define OTL_STR_TO_BIGINT(str,n) \ { \ n=atoll(str); \ } #define ...

  9. BP神经网络的基本原理

    2.1 BP神经网络基本原理 BP网络模型处理信息的基本原理是:输入信号Xi通过中间节点(隐层点)作用于输出节点.经过非线形变换,产生输出信号Yk,网络训练的每一个样本包含输入向量X和期望输出量t,网 ...

  10. [WPF]静态资源(StaticResource)和动态资源(DynamicResource)

    一.文章概述 本演示介绍WPF基本采用静态和动态的资源.而且两者都做一个简单的比较. 静态资源(StaticResource)指的是在程序加载内存时对资源的一次性使用,之后就不再訪问这个资源了:动态资 ...