[tyvj1214]硬币问题

描述

有n种硬币,面值为别为a[1],a[2],a[3]……a[n],每种都有无限多。给定非负整数s,可以选取多少个硬币使得面值和恰好为s?输出硬币数目最小值和最大值

输入格式

第1行n
第2行s
第3到n+2行为n种不同的面值

输出格式

第1行为最小值
第2行为最大值

测试样例1

输入

3
6
1
2
3

输出

2
6

备注

1<=n<=100
1<=s<=10000
1<=a[i]<=s


分析

完全背包问题,由于题目说恰好取到某面值和,所以要加一个判断数组B,判断是否可以刚好取到该面值。

代码

 1 #include <iostream>
 2 using namespace std;
 3 bool B[10001];
 4 int F[10001];
 5 int G[10001];
 6 int A[101];
 7 int n, s;
 8 int main()
 9 {
10     cin >> n >> s;
11     for (int i = 0; i != n; ++i)
12         cin >> A[i];
13     for (int i = 1; i <= s; ++i)
14         F[i] = 200000000;
15     B[0] = true;
16     for (int i = 0; i != n; ++i) {
17         for (int j = A[i]; j <= s; ++j) {
18             if (B[j - A[i]]) {
19                 B[j] = true;
20                 if (F[j - A[i]] + 1 < F[j])
21                     F[j] = F[j - A[i]] + 1;
22                 if (G[j - A[i]] + 1 > G[j])
23                     G[j] = G[j - A[i]] + 1;
24             }
25         }
26     }
27     cout << F[s] << ‘\n‘ << G[s];
28     return 0;
29 }
时间: 2024-10-14 00:58:16

[tyvj1214]硬币问题的相关文章

【bzoj1042】 HAOI2008—硬币购物

http://www.lydsy.com/JudgeOnline/problem.php?id=1042 (题目链接) 题意:共有4种硬币,面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买s的价值的东西.请问每次有多少种付款方法. Solution  容斥原理.  设F[i]为不考虑每种硬币的数量限制的情况下,得到面值i的方案数.则状态转移方程为 F[i]=Sum{F[i-C[k]] | i-C[k]>=0 且 k=1..4} ,边界条件F[0]=0. 

[HAOI2008]硬币购物

[HAOI2008]硬币购物 题目描述 硬币购物一共有4种硬币.面值分别为c1,c2,c3,c4.某人去商店买东西,去了tot次.每次带di枚ci硬币,买si的价值的东西.请问每次有多少种付款方法. 输入输出格式 输入格式: 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s 输出格式: 每次的方法数 输入输出样例 输入样例#1: 1 2 5 10 2 3 2 3 1 10 1000 2 2 2 900 输出样例#1: 4 27 说明 di,s<=100000 to

蓝桥杯 [翻硬币] 贪心

题目链接:http://lx.lanqiao.cn/problem.page?gpid=T29 题目大意:给两个串,初始串和目标串,每一位表示硬币的正反状态.一次操作的定义是让两个相邻的硬币反面.问从初始状态到目标状态所需要的最少操作次数是多少. 关键思想:贪心.要知道如果两个串的某一位不同,那这一位必然要经历奇数次操作,而且先翻或者后翻是没有影响的.那你想,既然是奇数次,那么最好的情况就是一次搞定啊.解决方案是有的,也很容易想--从左到右扫描,一旦扫描到一位不同,就执行一次操作,而此后的所有操

动态规划 硬币问题

题目:有n种硬币,面值分别为V1,V2,...Vn,每种都有无限多.给定非负整数S,可以选用多少个硬币,使得面值之和恰好为S?输出硬币数目的 最小值和最大值! 如果我们有面值为1元.3元和5元的硬币若干枚,如何用最少的硬币凑够11元? (表面上这道题可以用贪心算法,但贪心算法无法保证可以求出 解,比如1元换成2元的时候) 首先我们思考一个问题,如何用最少的硬币凑够i元(i<11)?为什么要这么问呢? 两个原因:1.当我们遇到一个大问题时,总是习惯把问题的规模变 小,这样便于分析讨论. 2.这个规

【TK】1025: 统计硬币

1025: 统计硬币 时间限制: 1 Sec  内存限制: 32 MB提交: 2409  解决: 1107[提交][状态][下载(1元)] 题目描述 假设一堆由1分.2分.5分组成的n个硬币总面值为m分,求一共有多少种可能的组合方式(某种面值的硬币可以数量可以为0). 输入 输入数据第一行有一个正整数T,表示有T组测试数据.接下来的T行,每行有两个数n,m,n和m的含义同上. 输出 对于每组测试数据,请输出可能的组合方式数,每组输出占一行. 样例输入 2 3 5 4 8 样例输出 1 2 1 0

luogu P1146 硬币翻转

题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作). 输入输出格式 输入格式: 输入只有一行,包含一个自然数N(N为不大于100的偶数). 输出格式: 输出文件的第一行包含一个整数S,表示最少需要的操作次数.接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,

P1146 硬币翻转

题目描述 在桌面上有一排硬币,共N枚,每一枚硬币均为正面朝上.现在要把所有的硬币翻转成反面朝上,规则是每次可翻转任意N-1枚硬币(正面向上的被翻转为反面向上,反之亦然).求一个最短的操作序列(将每次翻转N-1枚硬币成为一次操作). 输入输出格式 输入格式: 输入只有一行,包含一个自然数N(N为不大于100的偶数). 输出格式: 输出文件的第一行包含一个整数S,表示最少需要的操作次数.接下来的S行每行分别表示每次操作后桌上硬币的状态(一行包含N个整数(0或1),表示每个硬币的状态:0――正面向上,

1381 硬币游戏

1381 硬币游戏 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有一个简单但是很有趣的游戏.在这个游戏中有一个硬币还有一张桌子,这张桌子上有很多平行线(如下图所示).两条相邻平行线之间的距离是1,硬币的半径是R,然后我们来抛硬币到桌子上,抛下之后硬币有时候会和一些直线相交(相切的情况也算是相交),有时候不会. 请你来计算一下抛一次硬币之后,该硬币和直线相交数目的期望. Input 第一行给出一个整数T,表示有T组数据(1<=T<=10000). 第2行到T

hihocoder [Offer收割]编程练习赛14 投掷硬币

题目2 : 投掷硬币 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi有一枚神奇的硬币.已知第i次投掷这枚硬币时,正面向上的概率是Pi. 现在小Hi想知道如果总共投掷N次,其中恰好M次正面向上的概率是多少. 输入 第一行包含两个整数N和M. 第二行包含N个实数P1, P2, ... PN. 对于30%的数据,1 <= N <= 20 对于100%的数据,1 <= N <= 1000, 0 <= M <= N, 0 <= Pi &