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的更多相关文章

  1. DP:Coins(POJ 1742)

      用硬币换钱 题目大意:就是有面值为A1,A2,A3....的硬币,各有C1,C2,C3...的数量,问在钱数为m的范围内,能换多少钱?(不找零) 这题看名字就知道是完全背包,但是这题又有点不一样, ...

  2. Coins POJ - 1742

    给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数. Input 多组数据,每组数据前两个数字为n,m.n表示硬币种类数,m为最大面额,之后前n个数为每种硬币的面额,后n个数为相应每种硬币的个数 ...

  3. hdu 2844 poj 1742 Coins

    hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...

  4. Coins HDU - 2844 POJ - 1742

    Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...

  5. 题解报告:hdu 2844 & poj 1742 Coins(多重部分和问题)

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

  6. [POJ 1742] Coins 【DP】

    题目链接:POJ - 1742 题目大意 现有 n 种不同的硬币,每种的面值为 Vi ,数量为 Ni ,问使用这些硬币共能凑出 [1,m] 范围内的多少种面值. 题目分析 使用一种 O(nm) 的 D ...

  7. poj 1742(好题,楼天城男人八题,混合背包)

    Coins Time Limit: 3000MS   Memory Limit: 30000K Total Submissions: 33269   Accepted: 11295 Descripti ...

  8. The Fewest Coins POJ - 3260

    The Fewest Coins POJ - 3260 完全背包+多重背包.基本思路是先通过背包分开求出"付出"指定数量钱和"找"指定数量钱时用的硬币数量最小值 ...

  9. poj 1742 Coins (多重背包)

    http://poj.org/problem?id=1742 n个硬币,面值分别是A1...An,对应的数量分别是C1....Cn.用这些硬币组合起来能得到多少种面值不超过m的方案. 多重背包,不过这 ...

  10. poj 1742 Coins(dp之多重背包+多次优化)

    Description People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar. ...

随机推荐

  1. 创建虚拟机,安装操作系统,xshell6远程链接

    一.创建虚拟机 1. 首先安装vmware,注意在安装中,下面的两项不要勾选,一路下一步 2.完成安装打开之后,创建新的虚拟机 3.虚拟机创建完成,需要改配置 4.然后设置网段 5.查看服务,在运行状 ...

  2. Oracle DBCA工具检测不到ASM磁盘组

    本例环境: 操作系统OEL 6.5 数据库版本:11.2.0.4 问题:DBCA建库的时候,检测不到ASM磁盘组 因素一:可能是在授权的时候执行了 chown –R 775 /u01/app等修改权限 ...

  3. mock的那点事

    前言: Mock在GitHub上有12.9K的star可以看出,它在技术团队中是挺受欢迎的.这项技术被应用在不同领域的项目中. 适用场景: 下面我结合我们技术团队,列举最适合引入我们Mock服务的场景 ...

  4. [CSP-S模拟测试]:最大或(数学)

    题目传送门(内部题141) 输入格式 输入文件包含多组测试数据,第一行为一个正整数$T$,表示数据组数. 接下来$T$行,每行两个正整数$l,r$.数据保证$l\leqslant r$成立. 输出格式 ...

  5. Keras学习笔记二:保存本地模型和调用本地模型

    使用深度学习模型时当然希望可以保存下训练好的模型,需要的时候直接调用,不再重新训练 一.保存模型到本地 以mnist数据集下的AutoEncoder 去噪为例.添加: file_path=" ...

  6. 回调函数(callback) python / c++ 演示

    什么是回调函数? 我们绕点远路来回答这个问题. 编程分为两类:系统编程(system programming)和应用编程(application programming).所谓系统编程,简单来说,就是 ...

  7. H264编码原理以及I帧、B和P帧详解, H264码流结构分析

    H264码流结构分析 http://blog.csdn.net/chenchong_219/article/details/37990541 1.码流总体结构: h264的功能分为两层,视频编码层(V ...

  8. 类 kotlin(13)

    Kotlin 中使用关键字 class 声明类class Invoice {} 类声明由类名.类头(指定其类型参数.主 构造函数等) 和由大括号包围的类体构成.类头和类体都是可选的:如果一个类没有类体 ...

  9. RGB颜色透明度转换

    100% — FF95% — F290% — E685% — D980% — CC75% — BF70% — B365% — A660% — 9955% — 8C50% — 8045% — 7340% ...

  10. JMeter4.0分布式调度压测部署

    我们在Loadrunner学过使用Load Generator做肉鸡, 通过Controller来进行脚本和权重的分配来进行分布式压测, Jmeter作为当今的网红性能测试工具,这个功能必须是少不了的 ...