题文:https://vjudge.net/problem/12364(或者见紫书)

题解:

  因为题目中有两个限制条件,那么我们就顺着题目的意思来dp,设dp[i][j]表示目前还剩下的i个火柴,用这i根火柴所能凑出的%m是j的最大的数,那么转移就是枚举最左边的数x,那么就转移到了dp[i-shu[x]][(j*10+x)%m]。但如果用dp数组直接存数的话数组那么就要写高精度了,应为最大会有55位。

  考虑设dp[i][j]存的是用这i根火柴所能凑出的%m是j的最大的数的数位,p[i][j]表示这个数首位是什么,那么dp[i][j]=max(dp[i-need[shu]][(j*10+shu)%m])+1;为了保证我们选的数是最大的,我们枚举数的时候要从大的开始枚举。最后重新检查一下最优的结构就可以把数打印出来了。

  有一些细节,可以看一下代码。

代码:

#include<iostream>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXNN=+;
const int MAXNM=+;
int need[]={,,,,,,,,,};
int dp[MAXNN][MAXNM],p[MAXNN][MAXNM];
int n,m;
int main(){
int hhh=;
while(++hhh){
scanf("%d",&n);
if(!n) break;
printf("Case %d: ",hhh);
scanf("%d",&m);
memset(p,-,sizeof(p));
for(int i=;i<=n;i++)
for(int j=;j<m;j++){
int ans=-;
if(!j) ans=;
for(int shu=;shu>=;shu--)
{
if(i>=need[shu])
{
int t=dp[i-need[shu]][(j*+shu)%m];
if(t>=&&t+>ans)
{
ans=t+;
p[i][j]=shu;
}
}
}
dp[i][j]=ans;
}
if(p[n][]==-) printf("-1");
else{
int j=;
for(int now=p[n][j];now>=;now=p[n][j]){
printf("%d",now);
n-=need[now];
j=(now+j*)%m;
}
}
printf("\n");
}
}

UVa12105 越大越好的更多相关文章

  1. uva12105 Bigger is Better

    更简单的做法:定义状态dp[i][j]表示在已经用了i根火柴的情况下拼出来了剩余部分(是剩余部分,不是已经拼出来了的)为j(需要%m)的最大长度,一个辅助数组p[i][j]表示状态[i][j]的最高位 ...

  2. 谈一下关于CQRS架构如何实现高性能

    CQRS架构简介 前不久,看到博客园一位园友写了一篇文章,其中的观点是,要想高性能,需要尽量:避开网络开销(IO),避开海量数据,避开资源争夺.对于这3点,我觉得很有道理.所以也想谈一下,CQRS架构 ...

  3. MySQL优化聊两句

    原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...

  4. Linux基础介绍【第四篇】

    Linux文件和目录的属性及权限 命令: [root@oldboy ~]# ls -lhi total 40K 24973 -rw-------. 1 root root 1.1K Dec 10 16 ...

  5. Linux实战教学笔记08:Linux 文件的属性(上半部分)

    第八节 Linux 文件的属性(上半部分) 标签(空格分隔):Linux实战教学笔记 第1章 Linux中的文件 1.1 文件属性概述(ls -lhi) linux里一切皆文件 Linux系统中的文件 ...

  6. 程序员装B指南

    一.准备工作 "工欲善其事必先利其器." 1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好.一个用来查资料,一个用来写代码.总之要显得信息量很大,效率很高 ...

  7. EasyPR--开发详解(8)文字定位

    今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...

  8. 深入解析js异步编程利器Generator

    我们在编写Nodejs程序时,经常会用到回调函数,在一个操作执行完成之后对返回的数据进行处理,我简单的理解它为异步编程. 如果操作很多,那么回调的嵌套就会必不可少,那么如果操作非常多,那么回调的嵌套就 ...

  9. 用scikit-learn学习K-Means聚类

    在K-Means聚类算法原理中,我们对K-Means的原理做了总结,本文我们就来讨论用scikit-learn来学习K-Means聚类.重点讲述如何选择合适的k值. 1. K-Means类概述 在sc ...

随机推荐

  1. css 实现居中的五种方式

      一 .文字居中 1 固定容器高度的单行文本垂直居中:height=line-height         2 未知容器高度的文本垂直居中:设定padding,使上下的padding值相同即可   ...

  2. VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示

    VUE Node模式下,如何改变菜单的颜色,如何将超长文字缩略显示,在鼠标进入后展开全部显示,鼠标移出则恢复缩略显示: “事件”引起变量值的变化,系统引擎自动根据变量值的变化刷新页面 在VUE Nod ...

  3. STA——multicycle path

    之前去地平线面试的时候被问到了multicycle path的一点问题,其实这个问题我应该知道,看过<Constraining Designs for Synthesis and Timing  ...

  4. 猿类如何捕获少女心--难以琢磨的try-catch

    背景故事 影片<金刚>是2005年上映的一部冒险电影,它讲述1933年的美国,一名勇于冒险的企业家及电影制作者,率领摄制队伍到荒岛拍摄,其中包括女主角安及编剧杰克,他们遇到恐龙及当地土著的 ...

  5. CentOS7 常用命令

    常用命令 1.文件与目录操作 命令 解析 cd /home 进入 ‘/home’ 目录 cd .. 返回上一级目录 cd ../.. 返回上两级目录 cd - 返回上次所在目录 cp file1 fi ...

  6. 二分练习题2 查找大于等于x的最小元素 题解

    题目描述 现在告诉你一个长度为 \(n\) 的有序数组 \(a_1, a_2, ..., a_n\) ,以及 \(q\) 次询问,每次询问会给你一个数 \(x\) ,对于每次询问,你需要输出数组 \( ...

  7. JDK11,JDK12没有JRE的解决方法

    jdk11和jdk12在以前版本基础上,改动有点大,安装后默认是没有jre的. 解决方法: 在JDK目录下使用bin\jlink.exe --module-path jmods --add-modul ...

  8. linux 操作系统级别监控 df 命令

    df命令可以查看当前系统磁盘空间的使用情况 命令:df -h du -sh * 查看目录文件暂用磁盘大小 如果磁盘空间不够,需清理磁盘 磁盘速度测试,如果磁盘性能不好,性能测试数据会不准确(读写速度) ...

  9. SQLServer之MAX() 函数

    MAX() 函数 MAX 函数返回一列中的最大值.NULL 值不包括在计算中. SQL MAX() 语法 SELECT MAX(column_name) FROM table_name 注释:MIN ...

  10. ORA-08102异常重现及恢复

    现象: 在表上面新建主键报ORA-08102的异常: SQL> alter table t add primary key(id); alter table t add primary key( ...