Coins —— POJ-1742
| Time limit | 3000 ms |
| Memory limit | 30000 kB |
Description
People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony opened his money-box and found there were some coins.He decided to buy a very nice watch in a nearby shop. He wanted to pay the exact price(without change) and he known the price would not more than m.But he didn't know the exact price of the watch.
You are to write a program which reads n,m,A1,A2,A3...An and C1,C2,C3...Cn corresponding to the number of Tony's coins of value A1,A2,A3...An then calculate how many prices(form 1 to m) Tony can pay use these coins.
Input
The input contains several test cases. The first line of each test case contains two integers n(1<=n<=100),m(m<=100000).The second line contains 2n integers, denoting A1,A2,A3...An,C1,C2,C3...Cn (1<=Ai<=100000,1<=Ci<=1000). The last test case is followed by two zeros.
Output
For each test case output the answer on a single line.
Sample Input
3 10
1 2 4 2 1 1
2 5
1 4 2 1
0 0
Sample Output
8
4
题目分析
这个题已经有很多大佬写出来了,我就简单的分析一下吧。
这个题的目的是求1-m 之间有多少个价值可以用 n 个银币凑齐,所以我们在DP的过程中标记一下这个价值就可以了。
我觉得代码里面写的很详细了,所以就不多说了
代码区
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int maxn = 100000 + 10; //数组要开到10000 ,我也是有点怕内存呀,不过没爆就对了
int v[maxn], w[maxn],dp[maxn];
int main()
{
int n,m;
while(cin>>n>>m && n && m)
{
//乏味的读取数据
for(int i = 1; i <= n ; i++)
{
cin >> v[i];
}
for (int i = 1; i <= n; i++)
{
cin >> w[i];
}
//进入正片了
memset(dp, -1, sizeof(dp)); //dp[i] >= 0 表示价值i可以被凑齐,而 dp[i] = -1 ,表示无法凑齐
//下标表示价值
dp[0] = 0; //表示价值为0 的不需要任何银币,所以其值为0
for(int i = 1 ; i <= n ; i ++) //从第一种银币开始
{
for(int j = 0 ; j <= m ; j ++) //枚举价值,检验是否某一价值可以利用 第 i 个银币转移而来
{
if (dp[j] >= 0) //这意味着这个价值已经被找到,不需要判断是否可以凑齐
dp[j] = w[i]; //表示这一状态还剩下可以用于转移的银币数量,不过这是初始设定的,
//已经凑齐的价值可以通过加上若干个第i中银币找到下一个可以凑齐的价值
else if (j < v[i] || dp[j-v[i] ] <= 0)
{ //前一个条件表示剩余价值不能再加上一个该种银币以实现状态转移
//后一个条件表示用了这个价值的银币用完了,或者用之前的状态凑不齐,没有根基,转移不起
//也就是上一个状态不能实现,那么在上一状态的基础上加上银币,不能保证目前状态可以实现。
//dp[j]的值表示还可以使用第i中银币数,银币数不足的时候自然不能继续转移下去
//对于这种清空,此时 dp[ j- val[i]]的值为0 ,则转移后dp[j]的值变为-1,表示无法凑成
dp[j] = -1; //表示无法实现
}
else
{ //执行到了这一步,满足条件:
//1:这一价值还没有被确定可以凑齐,dp[j]在复制之前值为-1
//2:用价值为val[i] 的银币,凑成价值为j的状态是存在的,也就是有路可以继续走下的意思
//3:此时的j一定可以被凑齐
dp[j] = dp[j - v[i]] - 1;
}
}
}
int sum = 0; //统计可凑齐的价值个数
for(int i = 1; i <= m ;i ++) //由题意可知价值0不算在内
{
if (dp[i] >= 0) //dp[i]>=0 意味着价值 i 可以被凑齐
sum++;
}
cout << sum << endl;
//一组数据结束
}
return 0;
}
Coins —— POJ-1742的更多相关文章
- DP:Coins(POJ 1742)
用硬币换钱 题目大意:就是有面值为A1,A2,A3....的硬币,各有C1,C2,C3...的数量,问在钱数为m的范围内,能换多少钱?(不找零) 这题看名字就知道是完全背包,但是这题又有点不一样, ...
- Coins POJ - 1742
给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数 ...
- hdu 2844 poj 1742 Coins
hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...
- Coins HDU - 2844 POJ - 1742
Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...
- 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)
Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...
- [POJ 1742] Coins 【DP】
题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...
- poj 1742(好题,楼天城男人八题,混合背包)
Coins Time Limit: 3000MS Memory Limit: 30000K Total Submissions: 33269 Accepted: 11295 Descripti ...
- The Fewest Coins POJ - 3260
The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...
- poj 1742 Coins (多重背包)
http://poj.org/problem?id=1742 n个硬币,面值分别是A1...An,对应的数量分别是C1....Cn.用这些硬币组合起来能得到多少种面值不超过m的方案. 多重背包,不过这 ...
- poj 1742 Coins(dp之多重背包+多次优化)
Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...
随机推荐
- 4-EM算法原理及利用EM求解GMM参数过程
1.极大似然估计 原理:假设在一个罐子中放着许多白球和黑球,并假定已经知道两种球的数目之比为1:3但是不知道那种颜色的球多.如果用放回抽样方法从罐中取5个球,观察结果为:黑.白.黑.黑.黑,估计取到黑 ...
- React 的 DOM 添加多个点击事件
第一直觉代码如下:后果是写在后面的事件函数覆盖前面的事件函数,只执行第二条(弹出 222). import React, { Component, Fragment } from 'react' ex ...
- apache httpd.conf 文件的 详解
文章 摘自 :http://www.php100.com/html/webkaifa/apache/2009/0418/1192.html ServerRoot /usr/local Server ...
- C++入门经典-例8.3-子类显示调用父类构造函数
1:当父类含有带参数的构造函数时,创建子类的时候会调用它吗?答案是通过显示方式才可以调用. 无论创建子类对象时调用的是那种子类构造函数,都会自动调用父类默认构造函数.若想使用父类带参数的构造函数,则需 ...
- VirtualBox——在Win7的HOST上安装配置虚拟机CentOS7
在Win7为HOST的环境下,安装VirtualBox,在其中安装CentOS7,以Bridge的方式搭建网络环境. 主要配置包括VirtualBox中的网络设置,以及CentOS中的网络配置.另外还 ...
- 一、基础篇--1.1Java基础-Java运算符优先级
在一个表达式中可能包含多个有不同运算符连接起来的.具有不同数据类型的数据对象:由于表达式有多种运算,不同的结合顺序可能得出不同结果甚至出现错误运算错误,因为当表达式中含多种运算时,必须按一定顺序进行结 ...
- 搭建Java服务器,并且实现远程安全访问linux系统
1.通过ssh实现安全远程访问linux系统 ssh :secure shell 加密: 1. 对称加密 (加密密钥与解密密钥相同) des ...
- Systemd 指令
Systemd 指令 原文:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html 一.由来 历史上,Linux 的 ...
- 五十:数据库之Flask-Script详解
使用flask-script可以实现自定义命令来操作flask,如:可以通过命令来跑一个开发版本的服务器.设置数据库.定时任务等安装:pip install flask-script 命令的添加方式1 ...
- JavaScript高程第三版笔记(1-5章)
第2章:在html中使用javascript ①script标签的defer属性 <script type="text/javascript" defer="def ...