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. ...
随机推荐
- flask框架(一):初入
1.装饰器回顾 # -*- coding: utf-8 -*- # @Author : Felix Wang # @time : 2018/7/3 17:10 import functools &qu ...
- 「HEOI2014」大工程
问题分析 首先不难想到是虚树.建完虚树需要保持节点间原先的距离关系. 然后总距离和最小距离用树形DP求,最大距离用两遍dfs即可.注意统计的时候只对关键点进行统计. 真是麻烦 参考程序 ac的时候是l ...
- .NET DLL 保护措施详解(非混淆加密加壳)
为什么要保护DLL,我就不多说了,各人有各人的理由.总的来说,就是不想核心逻辑泄露及授权验证被破解两大方面的因素.市面上的混淆加密工具对.NET源码保护的效果天差地别,很多网上下到的混淆工具破解版对. ...
- 微信小程序之条件判断
前文: 今天踩了一下午的坑,但是确实很简单的问题. 我说一下需求:扫描商品的二维码,从而判断,同一个二维码不可多次扫描: 点击扫一扫 会在灰色区域展示 扫描的商品信息,比如商品名称,商品码等,但是我们 ...
- java逆向工程-mybatis-generator
题记:在快速开发的项目中有使用到,这样可以避免冗余工作 声明:参考于https://www.cnblogs.com/smileberry/p/4145872.html 环境:必须先安装maven环境, ...
- mysql 安装 和 mysql 远程连接
一.mysql安装 1.下载MySQL数据库可以访问官方网站:https://www.mysql.com/ 2.点击DOWNLOADS模块下的Community模块下的MySQL Community ...
- Jmeter如何使用数据库返回值实践
Jmeter如何使用数据库返回值实践 最近使用Jmeter针对产品做性能测试,测试内容是要模拟300并发用户审批休假申请时的性能.由于每个申请人的主管不同,且会根据不同的休假类型,会有一级审批或者二级 ...
- 性能测试的 Check List (不断更新中)
1. 开发人员是否提交了测试申请?2. 测试对象是否已经明确?3. 测试范围是否已经明确?4. 本次不被测试的范围是否已经明确?5. 测试目标是否已经明确?6. 何时开始性能测试?7. 何时终止一轮性 ...
- .NetCore接入Log4Net
首先接入NuGet包Log4Net 在项目中添加log4net.config文件 Log4Net的级别None>FATAL>ERROR>WARN>INFO>DEBUG&g ...
- HBase 数据恢复
参考链接: https://community.hortonworks.com/content/supportkb/48748/hbase-master-wont-start-with-followi ...