意甲冠军:你有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 元钱,上马:

//281MS 648K
#include <stdio.h>
#include <string.h>#define MAX 102int ans;//最后答案
int n,m;
int A[MAX],C[MAX];
int dp[100005];void ZeroOne(int V,int W)
{for(int i = m; i >= V; i--)//dp[i] = dp[i]>dp[i-V]+W ?

dp[i]:dp[i-V]+W; if(dp[i]<dp[i-V]+W) { dp[i] = dp[i-V]+W;//这里需改动如此统计 if(dp[i] == i) ans ++;//在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后 } } int main() { while(scanf("%d%d",&n,&m),n+m) { ans = 0; memset(dp,0,sizeof(dp)); for(int i = 1; i <= n; i ++) scanf("%d",&A[i]); for(int i = 1; i <= n; i ++) scanf("%d",&C[i]); for(int i = 1; i <= n; i ++) { if(A[i]*C[i] >= m) { for(int j = A[i]; j <= m; j ++) //dp[j] = dp[j]>dp[j-A[i]]+A[i] ? dp[j]:dp[j-A[i]]+A[i]; //将价值和重量看做同样 if(dp[j]<dp[j-A[i]]+A[i]) //这里需改动如此统计ans { dp[j] = dp[j-A[i]]+A[i]; if(dp[j] == j) ans ++; //在dp过程中,会有出现dp[j]更新为j的时候 且仅仅有一次,也要放在dp[i]=dp[i-V]+W;此语句后 } } else { int k = 1; while(k <= C[i]) { ZeroOne(A[i]*k,A[i]*k); C[i] -= k; k *= 2; } ZeroOne(C[i]*A[i],C[i]*A[i]); } } //for(int i = 1; i <= m; i ++) if(dp[i]==i)ans++;//这里用以用在hdu,可是poj须要用上面的方式统计ans,不然会超时,过了也过得非常险 2654ms........汗。。

。。

printf("%d\n",ans); } return 0; }

那么这里另一种方式

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

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

#include <iostream>
#include <cstring>
using namespace std;#define MAX 100005int N,M;
int A[MAX],C[MAX];
bool flag[MAX];
int time[MAX];int main()
{while(cin >> N >> M){if(!N && !M)break;for(int i = 0; i < N; i ++) cin >> A[i];for(int i = 0; i < N; i ++) cin >> C[i];int ans = 0;memset(flag,false,sizeof(flag));flag[0] = true;for(int i = 0; i < N; i ++){memset(time,0,sizeof(time));for(int j = A[i]; j <= M; j ++){//这里解释为。仅仅有当前j这样的情况没有构成,而且j-A[i]的情况存在--(这里也就是相似全然背包,这次状态应该依赖前面存在情况),同一时候到j为止。用第i种硬币的数量不超过C[i]的情况下才满足条件if(!flag[j] && flag[j-A[i]] && time[j-A[i]]+1 <= C[i]){flag[j] = true;time[j] = time[j-A[i]]+1;ans ++;}}}cout << ans <<endl;}return 0;
}

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

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

转载于:https://www.cnblogs.com/zfyouxi/p/4803581.html

hdu2844 amp; poj1742 Coin ---多重背包--两种方法相关推荐

  1. 0-1背包问题详解-动态规划-两种方法

    问题描述: 给定n种物品和一背包.物品i的重量为wi,其价值为vi, 背包容量为c.问应如何选择装入背包中的物品,使得背入背包的物品的总价值最大? 解析: 此问题形式化的描述是,给定c > 0, ...

  2. SQL Server中灾难时备份结尾日志(Tail of log)的两种方法

    简介 在数据库数据文件因各种原因发生损坏时,如果日志文件没有损坏.可以通过备份结尾日志(Tail of log)使得数据库可以恢复到灾难发生时的状态. 例如: 上图中.在DB_1中做了完整备份,在Lo ...

  3. C++/C++11中用于定义类型别名的两种方法:typedef和using

    类型别名(type alias)是一个名字,它是某种类型的同义词.使用类型别名有很多好处,它让复杂的类型名字变得简单明了.易于理解和使用,还有助于程序员清楚地知道使用该类型的真实目的.在C++中,任何 ...

  4. jquery-12 折叠面板如何实现(两种方法)

    jquery-12 折叠面板如何实现(两种方法) 一.总结 一句话总结:1.根据点击次数来判断显示还是隐藏,用data方法保证每个元素一个点击次数:2.找到元素的下一个,然后toggle实现显示隐藏. ...

  5. java 匿名list,java创造匿名对象的两种方法

    在java中有时候需要一些匿名对象的使用.可能有些小伙伴拿还不会创造,其实我们在学习一些方法时都或多或少的接触过.本篇所要讲到的创造匿名对象总结了两种方法,分别是静态工具方法和Lambda表达式,我们 ...

  6. Android Studio导入Eclipse项目的两种方法

    Android Studio导入Eclipse项目有两种方法,一种是直接把Eclipse项目导入Android Studio,另一种是在Eclipse项目里面进行转换,然后再导入Android Stu ...

  7. Response.Redirect 打开新窗体的两种方法

    普通情况下,Response.Redirect 方法是在server端进行转向,因此,除非使用 Response.Write("<script>window.location=' ...

  8. centos下两种方法安装git

    centos 5 64位下两种方法安装git 这里来给大家介绍下编译安装和yum安装git.   系统:centos 5.5 64位   需要的软件包:git-latest.tar.gz epel-r ...

  9. mysql创建库几种方法_MySQL创建数据库的两种方法

    本文为大家分享了两种mysql创建数据库的方法,供大家参考,具体内容如下 第一种方法:使用 mysqladmin 创建数据库使用普通用户,你可能需要特定的权限来创建或者删除 mysql 数据库. 所以 ...

最新文章

  1. model.parameters(),model.state_dict(),model .load_state_dict()以及torch.load()
  2. figma下载_我如何使用Figma,CSS Grid和CSS Flexbox构建登录页面
  3. 上网登录窗不弹出_配置 Windows XP 正常上网(TLS HTTPS),连接到 NAS
  4. 四则运算题目生成程序(基于控制台)
  5. ubuntu 安装cudnn
  6. 动漫风格迁移——AnimeGANv2的实现【复现】
  7. php 和风天气,【原创】彩云/和风天气插件
  8. heka 输出到mysql_用php与mysql的电子贺卡程序
  9. 限制UITextView输入字数(兼容iOS7)
  10. android判断极光推送是不是注册成功,android极光推送用户怎么注册sdk
  11. BootStrap--CSS组件--按钮组(btn-group)
  12. 关闭win10的防护系统
  13. 浏览器(js)打开window程序
  14. 儿童玩具出口欧盟CE认证测试标准
  15. 前端重点---DNS和CDN
  16. 股份有限公司的章程包括哪些内容?
  17. 软件测试实战项目04:打包app
  18. 各平台DNS刷新方法-Windows/Mac/Linux
  19. 3D基础--Vertex
  20. 收到iPhone X之后该怎么晒?

热门文章

  1. 你见过股市亏最惨的有多惨?
  2. 安装win10和ubuntu双系统启动不了解决
  3. merge语句_SQL Server MERGE语句概述和示例
  4. sql server 主键_SQL Server中人口过多的主键和CE模型的变化
  5. sql server 视图_轻松搜索SQL Server –搜索目录视图
  6. Visual Studio 2008 编译程序时的 mt.exe 返回错误
  7. as5 samba 图形配置
  8. linux 配置内网yum源
  9. poj 1776 Task Sequences
  10. 程序安装出现错误代码为2869