原题

http://poj.org/problem?id=1742

题目大意

给出硬币面额及每种硬币的个数,求从1到m能凑出面额的个数。

题目分析

多重背包模板题,这里讲一下用一维dp来解这道题.与完全背包和01背包不同的是,这里dp定义比较特殊,单独的dp[i]没有意义的.所以先直接讲一下dp更新过程,首先外循环i=1→n遍历硬币,内循环从j=0→m遍历面额,然后这里dp[j]的意义是,硬币凑成j面额时第i种还剩下几个,所以说这个dp离开外循环i=1→n时没意义的.这里dp数组初始化为-1,-1表示不能凑成该面额,然后dp[0]=0.设定完这些就可以开始更新dp了,dp[j]需要更新的情况有(1)假设现在是第i个外循环,如果dp[j]>=0的,表示在用i-1硬币时能凑到这个面额(不管它剩下多少),直接令dp[j]=c[i],因为用前i-1种硬币已经能够凑到这个面额了,那么第i种硬币可以不需要用,即剩下c[i].(2)如果dp[j]等于-1,而dp[j-v[i]]>0,表示在用第i种硬币进行更新时,能凑到j-v[i]的面额并且还有剩下,则可以从j-v[i]面额用一个第i种硬币凑到j面额,此时有dp[j]=dp[j-v[i]]-1.(注意不要j-v[i]越界).最后答案只需要扫一遍dp数组看有几个是不为-1的输出即可.

代码

 1 #include <cstdio>
 2 #include <cmath>
 3 #include <iostream>
 4 #include <cstring>
 5 #include <algorithm>
 6 #include <vector>
 7 #include <string>
 8 #include <utility>
 9 #include <queue>
10 #include <stack>
11 const int INF=0x3f3f3f3f;
12 using namespace std;
13
14
15 int dp[100001];
16 int v[101];
17 int c[101];
18
19 int main()
20 {
21     int n,m;
22     while(cin>>n>>m&&(m||n))
23     {
24         for(int i=1;i<=n;i++) cin>>v[i];
25         for(int i=1;i<=n;i++) cin>>c[i];
26         memset(dp,-1,sizeof(dp));
27         dp[0]=0;
28         for(int i=1;i<=n;i++)
29         for(int j=0;j<=m;j++)
30         {
31             if(dp[j]>=0) dp[j]=c[i];
32             else if(j>=v[i]&&dp[j-v[i]]>0) dp[j]=dp[j-v[i]]-1;
33         }
34         int ans=0;
35         for(int i=1;i<=m;i++) if(dp[i]>=0) ans++;
36         cout<<ans<<endl;
37         memset(v,0,sizeof(v));
38         memset(c,0,sizeof(c));
39     }
40     return 0;
41 }

转载于:https://www.cnblogs.com/VBEL/p/10433218.html

Coins POJ - 1742(题解)相关推荐

  1. Coins POJ - 1742(多重背包+是否装满问题)

    题意: 给定n种面值的硬币面值分别为WiW_{i}Wi​个数为CiC_{i}Ci​,问用这些硬币可以组成1~m之间的多少面值. 题目: People in Silverland use coins.T ...

  2. [POJ 1742] Coins 【DP】

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

  3. POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

    题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到 ...

  4. POJ 1742 Coins

    题目链接 题意 给出N个硬币和数量,求一共可以组合成几种情况 AC bitset 用二进制的下标表示和,最后1的个数表示种类数 优化:用二次方移动加快速度 例如: 移动7次(需要4次) 1.0000 ...

  5. PAT甲级1048 Find Coins :[C++题解]哈希表、两个硬币之和为定值

    文章目录 题目分析 题目链接 题目分析 来源:acwing 题意:找两个数,和为定值. 分析:本题在各大OJ上几乎都有, 反正在Leetcode上做过.本题有两种常见的解法,一种是双指针,另一种是用哈 ...

  6. POJ 1154题解,此题不难理解方法就是DFS,属于水题。不过有一些细节要注意。...

    1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<string.h> 4 #include<iostre ...

  7. The Fewest Coins POJ - 3260

    题目传送门 题意:你去一个商店购买一个价值为T的物品,市场上有n种流通的硬币,面值分别为V1,V2..Vn (1<=Vi<=120).John有Ci个面值为Vi的硬币(0<=Ci&l ...

  8. POJ 2559 题解 最大矩形面积 单调栈

    [题目描述]: 地面上从左到右并排紧挨着摆放多个矩形,已知这此矩形的底边宽度都为1,高度不完全相等.求在这些矩形包括的范围内能得到的面积最大的矩形,打印出该面积.所求矩形可以横跨多个矩形,但不能超出原 ...

  9. Aggressive cows POJ - 2456 题解

    题目链接 点击这里 代码 #include <iostream> #include <algorithm>using namespace std;int N, M; const ...

最新文章

  1. 易企秀更换模板里的音乐_易企秀黄金:探索中国 SaaS 企业走向成功的路径
  2. 学习笔记Flink(八)—— 基于Flink 在线交易反欺诈检测
  3. 深蓝学院《从零开始手写VIO》作业六
  4. 《剑指offer》-- 回溯法:矩阵中的路径、机器人的运动范围
  5. xcode 不能读取键盘输入的汉字_C++:cin从控制台读取数据时的结束符
  6. 求二叉树节点个数、叶子节点、节点层次与宽度
  7. python输入流和输出流_Python 初体验之 输入输出流
  8. 句句真研—每日长难句打卡Day4
  9. c++ 创建文件夹_C/C++编程笔记:vscode搭建C/C++环境,初学编程可收藏
  10. 电大计算机绘图三锥图形,电大机械制图课程教学辅导
  11. html js格式化,Js/html格式化在线工具
  12. ADAS功能中LCA、LKA、LCK...区别
  13. tomcat 官网下载
  14. smbrun - smbd和外部程序间的接口程序。
  15. 使用Nordic芯片的手环OTA(android)
  16. ubuntu20 下从linux 5.14.0-1045 源码编译 linux-5.15.56 内核
  17. 小米电视安装 Plex 打造家庭影院
  18. java--阿拉伯数字转中文数字
  19. torch.roll() 函数用法
  20. 小程序配置服务器域名

热门文章

  1. XCTF-Reverse:insanity
  2. 任务和特权级保护(二)——《x86汇编语言:从实模式到保护模式》读书笔记32
  3. 程序的加载和执行(六)——《x86汇编语言:从实模式到保护模式》读书笔记26
  4. 操作系统(三十三)内存管理
  5. Hi3516A开发--GV7601 硬件设计
  6. DVRRDK, EZSDK和DVSDK这三者有什么区别
  7. 记录一次Socket编程:OutputStream的flush方法
  8. ACM/ICPC 2018亚洲区预选赛北京赛站网络赛 80 Days(双向队列+尺取法)
  9. 第一课 计算机网络的分类,第一课-计算机网络基本组成
  10. Android apk动态加载机制的研究(二):资源加载和activity生命周期管理