Atcoder Beginner Contest 118 D-Match Matching(完全背包)
题意就是给N根火柴,M个数(M只能是1到9,对应的数字也只能是1到9),只能用这M个出现过的数(但每个数可以随便用多少个,只要火柴够)来拼出一个数字(拼出1,2,3,4,5,6,7,8,9分别要用2,5,5,4,5,6,3,7,6根火柴),要求最大能拼出多大的数。
就是完全背包嘛,要是数字更大,数字长度必是首先要考虑的,再其次才是首位的数字大小。
dp[i]表示由i根火柴能拼出的数字的最大长度,match数组就是上面那个对应关系,k表示要加上哪个数字, match[k]就是要这个数字需要的火柴。
dp[i] = max(dp[i], dp[i-match[k]] + 1)
然后要找出数字,类似于找路径。
如果dp[i] - dp[i-match[k]] == 1,那么就是k这个数字
具体细节见代码
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <functional>
using namespace std; const int match_number[] = {, , , , , , , , , };
int dp[(int)1e4 + ];
int a[]; int main() {
memset(dp, -, sizeof(dp));
int n, m;
scanf("%d%d", &n, &m);
dp[] = ;
for (int i = ; i <= m; i++) scanf("%d", &a[i]);
sort(a + , a + + m, greater<int>());
for (int i = ; i <= m; i++) {
for (int j = match_number[a[i]]; j <= n; j++) {
if (dp[j-match_number[a[i]]] != -) {
dp[j] = max(dp[j], dp[j-match_number[a[i]]] + );
}
}
}
while (n) {
for (int i = ; i <= m; i++) {
if (n - match_number[a[i]] >= && dp[n] - dp[n - match_number[a[i]]] == ) {
n -= match_number[a[i]];
printf("%d", a[i]);
break;
}
}
}
return ;
}
Atcoder Beginner Contest 118 D-Match Matching(完全背包)的更多相关文章
- AtCoder Beginner Contest 118 解题报告
A - B +/- A #include <bits/stdc++.h> int main() { int a, b; std::cin >> a >> b; b ...
- Atcoder Beginner Contest 118
A: B +/- A 签到题. B: Foods Loved by Everyone 签到题. C: Monsters Battle Royale 怪物的血量一直两两相减,类似于辗转相减法. 可以证明 ...
- Atcoder Beginner Contest 118 C-Monsters Battle Royale(贪心)
题目链接 题意就是要让给出的数字去互相取余,看看能得到最小的数事多少. 那么就可以从小到大排序,每一次都贪心地把最小的数作为攻击者,去攻击其他的数字(也就是大的取余小的),然后再一次排序,循环这个过程 ...
- AtCoder Beginner Contest 100 2018/06/16
A - Happy Birthday! Time limit : 2sec / Memory limit : 1000MB Score: 100 points Problem Statement E8 ...
- AtCoder Beginner Contest 052
没看到Beginner,然后就做啊做,发现A,B太简单了...然后想想做完算了..没想到C卡了一下,然后还是做出来了.D的话瞎想了一下,然后感觉也没问题.假装all kill.2333 AtCoder ...
- AtCoder Beginner Contest 053 ABCD题
A - ABC/ARC Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Smeke has ...
- AtCoder Beginner Contest 136
AtCoder Beginner Contest 136 题目链接 A - +-x 直接取\(max\)即可. Code #include <bits/stdc++.h> using na ...
- AtCoder Beginner Contest 137 F
AtCoder Beginner Contest 137 F 数论鬼题(虽然不算特别数论) 希望你在浏览这篇题解前已经知道了费马小定理 利用用费马小定理构造函数\(g(x)=(x-i)^{P-1}\) ...
- AtCoder Beginner Contest 076
A - Rating Goal Time limit : 2sec / Memory limit : 256MB Score : 100 points Problem Statement Takaha ...
随机推荐
- CentOS7.4 ISCSI
试验机配置: cat /etc/centos-release CentOS Linux release 7.4.1708 (Core) uname -r 3.10.0-693.el7.x86_64 所 ...
- 使用 OAuth2-Server-php 搭建 OAuth2 Server
Yii 有很多 extension 可以使用,在查看了 Yii 官网上提供的与 OAuth 相关的扩展后,发现了几个 OAuth2 的客户端扩展,但是并没有找到可以作为 OAuth2 Server 的 ...
- HRBUST - 2347 - 递归画图 - vj大一上寒假训练2.11
其他题可由本题变形得到. 思路:利用坐标dfs搜索. 注意:1,初始化.2,坐标实时更新(x,y) 代码: #include<iostream> #include<cstdio> ...
- Quartz.NET 任务调度新教程
https://www.cnblogs.com/yscit/p/10393867.html
- 微信支付异常:appid and openid not match
上周调试微信小程序支付时遇到的问题,在调用统一下单接口获取微信支付的相关参数时,报了这么一个错误:appid and openid not match. 字面意思很容易理解,就是appid与openi ...
- C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 即时消息提醒功能改进
可以给自己的信息管理系统增加一些即时消息提醒功能,简单方便,一般是一行代码就可以发送提醒信息了,方便二次开发,个性化改进. 1:可以用简拼,快速查找内部员工. 2:双击直接可以发QQ消息. 3:双击直 ...
- mysqldump 和mysqlbinlog
一.mysqldump 1.备份test库 #mysqldump -uroot -p' test >test.sql 2.备份 -B参数 ' -B test >test_B.sql --B ...
- 分解质因数FZU - 1075
题目简述:就是给一个数,把他拆分成多个素数的乘积,这正好是算术基本定理.本题我的解决方法是埃氏素数筛+质因数保存...开始T掉了,是因为我在最后枚举了素数,保存他们的次数,然后两次for去查询他们的次 ...
- mysql数据库和JDBC学习
数据库概念: 数据库(Database)是按照数据结构来组织.存储和管理数据的建立在计算机存储设备上的仓库. ---------数据库服务器,mysql(管理) 数据库服务器---->N多库-- ...
- Problem 2285 迷宫寻宝
http://acm.fzu.edu.cn/problem.php?pid=2285 Problem Description 洪尼玛今天准备去寻宝,在一个n*n (n行, n列)的迷宫中,存在着一个入 ...