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. 美团小程序框架mpvue入门教程

    mpvue是一个使用 Vue.js 开发小程序的前端框架.框架基于 Vue.js 核心,mpvue 修改了 Vue.js 的 runtime 和 compiler 实现,使其可以运行在小程序环境中,从 ...

  2. Python3 日期与时间戳互相转换(函数可调用)

    一.前言 在开发中,我们经常会遇到时间戳转换日期,或者日期转换为时间戳: 日期格式:2019-08-01 00:00:00 时间戳格式:1564588800 关于时间戳 Unix时间戳(Unix ti ...

  3. 删除git的远程分支

    命令:$ git push origin [空格][冒号][需要删除的分支名字] git push origin :dev 删除git的凭证的方法: 控制面板\用户帐户\凭据管理器  --->普 ...

  4. 报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key 'username'

    在提交注册信息的时候报错:SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry 'admin' for key ' ...

  5. 用Java实现一个二叉树

    介绍 使用Java实现一个int值类型的排序二叉树 二叉树 二叉树是一个递归的数据结构,每个节点最多有两个子节点. 通常二叉树是二分查找树,每个节点它的值大于或者等于在它左子树节点上的值,小于或者等于 ...

  6. [SQL Server创建视图时的注意点]

    创建视图的查询语句必须要遵守一定的限制 1. 要对某些列取别名,并保证列名的唯一 (具有相同的列名的表,在创建视图的时候,需要使用别名,表名.列名 也是不可以的) 当我们在通过新建视图来创建视图的话, ...

  7. go之无缓冲channel(通道)和有缓冲channel(通道)

    channel我们先来看一下通道的解释:channel是Go语言中的一个核心类型,可以把它看成管道.并发核心单元通过它就可以发送或者接收数据进行通讯,这在一定程度上又进一步降低了编程的难度.chann ...

  8. windows10下如何完全卸载串口驱动?

    答: 所需步骤如下: 1. 以管理员身份启动cmd 2. 在cmd中输入两行命令来启动设备管理器 3. 设置view->Show hidden devices 4. 在Ports (COM &a ...

  9. Springboot2.0实现URL拦截

    1.创建一个登陆拦截器SecurityInterceptor,它继承HandlerInterceptorAdapter类 package com.cn.commodity.config; import ...

  10. CentOS7中yum配置

    1.打开centos的yum文件夹 输入命令cd  /etc/yum.repos.d/ 2.用wget下载repo文件 输入命令wget  http://mirrors.aliyun.com/repo ...