题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1539

大意是输入n和m,把m按顺序拆分成若干个数,问这些数和的在小于n的前提下最大为多少

注意必须m的每一位都不能漏,而且要按顺序拆

比如第一个例子 拆成的各个数为1,2,34 和6,可以拆成34,346但不能是36或364,要按顺序

而他们和的最大是43

如果找不出拆法能使各个数的和小于n,输出error

如果有不止一种拆法子,输出 rejected

0 0的时候结束 m最多为六位数

这道题在杭电和北大的oj上都有,但是杭电的数据更强,链接就是杭电的

既然是按顺序拆,可以看成只是在各个位之间放空格就好了 利用深搜的思想

从m的第一位开始往后取位,取到刚大于n的前一位(还是小于n的),把取的数加上然后以这一位为起点继续取

取到的这一位做标记,最后输出的时候没有标记的位数就不要输出空格

我觉得类似于排列组合的DFS

 #include<cstdio>
#include<cstring>
using namespace std;
int n,ans,a[],b[],k;
bool flag,pand[],dapand[];
void dfs(int pos,int sum,int num)
{
if (sum+num>n)
return ;
if (pos==k)
{
sum+=num;
if (sum<=n&&sum>ans)
{
ans=sum;
flag=false;
for (int i = ; i < k; i++)
dapand[i] = pand[i];
return ;
}
if (sum==ans)
flag=true;
return ;
}
dfs(pos+,sum,num*+a[pos]);//区位置
pand[pos]=true;
dfs(pos+,sum+num,a[pos]);//加和做比较
pand[pos]=false;
}
int main()
{
int m,i;
while (~scanf("%d %d",&n,&m))
{
if (n==&&m==)
break;
memset(pand,false,sizeof(pand));
ans=-;k=;
flag=true;
while (m)
{
b[k++]=m%;
m/=;
}
for (i=;i<k;i++)
a[i]=b[k-i-];
dfs(,,a[]);
if (ans==-)
{
printf("error\n");
continue;
}
if (flag)
{
printf("rejected\n");
continue;
}
printf("%d ",ans);
for (i=;i<k;i++)
{
if (dapand[i])
printf(" ");
printf("%d",a[i]);
}
printf("\n");
}
return ;
}

  

hdu 1539 & poj 1416 某某公司的更多相关文章

  1. 搜索+剪枝 POJ 1416 Shredding Company

    POJ 1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 5231   Accep ...

  2. HDU 3695 / POJ 3987 Computer Virus on Planet Pandora(AC自动机)(2010 Asia Fuzhou Regional Contest)

    Description Aliens on planet Pandora also write computer programs like us. Their programs only consi ...

  3. hdu 2844 poj 1742 Coins

    hdu 2844 poj 1742 Coins 题目相同,但是时限不同,原本上面的多重背包我初始化为0,f[0] = 1;用位或进行优化,f[i]=1表示可以兑成i,0表示不能. 在poj上运行时间正 ...

  4. HDU 3265/POJ 3832 Posters(扫描线+线段树)(2009 Asia Ningbo Regional)

    Description Ted has a new house with a huge window. In this big summer, Ted decides to decorate the ...

  5. HDU 2494/POJ 3930 Elevator(模拟)(2008 Asia Regional Beijing)

    Description Too worrying about the house price bubble, poor Mike sold his house and rent an apartmen ...

  6. 扫描线三巨头 hdu1928&&hdu 1255 && hdu 1542 [POJ 1151]

    学习链接:http://blog.csdn.net/lwt36/article/details/48908031 学习扫描线主要学习的是一种扫描的思想,后期可以求解很多问题. 扫描线求矩形周长并 hd ...

  7. POJ 1416 Shredding Company【dfs入门】

    题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Tot ...

  8. hdu 1540/POJ 2892 Tunnel Warfare 【线段树区间合并】

    Tunnel Warfare                                                             Time Limit: 4000/2000 MS ...

  9. Coins HDU - 2844 POJ - 1742

    Coins HDU - 2844 POJ - 1742 多重背包可行性 当做一般多重背包,二进制优化 #include<cstdio> #include<cstring> in ...

随机推荐

  1. 转换es6

    { "presets": [["env", { "modules": false }],"stage-3"," ...

  2. css 响应式布局

    移动端最让人闹心的就是在不同的手机要做错响应式布局适应各种手机,开始自己做这方面走了很多的弯路,响应式布局如果是部件,就按实际的大小单位px等设置,像宽可以按照百分比计算,长的可以百分比.auto 或 ...

  3. SSM框架下,使用ajax请求上传文件(doc\docx\excel\图片等)

    1.准备工作 1.1.添加上传必要jar包 <dependency> <groupId>commons-io</groupId> <artifactId> ...

  4. js中的全局变量

    在js中有3中声明全局变量的方式 第一种使用var+变量名,在方法外部声明: var msg; //默认值undefined $(function(){ setmsg(); showmsg(); }) ...

  5. Java Arrays

    最近经常有操作数组的需求,排序,倒转等操作,所以深入了解一下Arrays类 equals(a,b)比较数组a和数组b是否相等 toString(a)输出数组a binarySearch(a,i)二分查 ...

  6. GreenDao在列中的单词之间自动加_

    1.第一种情况,原字段(属性.列)是 驼峰式命名法 @Entitypublic class Employee { @Id(autoincrement = true) private Long id; ...

  7. zabbix监控常见系统报错

    CPU触发器:1)Processor load is too high on {HOST.NAME} {HOST.NAME}上处理器负载太高触发器表达式:{Zabbix server:system.c ...

  8. 全国高校绿色计算大赛 预赛第一阶段(C++)第3关:旋转数组

    挑战任务 在计算机中,一张数字图像,可以被看做是一个矩阵或者说数组. 学过线性代数的同学对矩阵肯定不陌生.一般来说,图像是一个标准的矩形,有着宽度(width)和高度(height).而矩阵有着行(r ...

  9. 静态方法调用内部类时候的new 问题

    package tool; /** * 静态方法调用内部类时候的new 问题 */ public class aa { // 静态方法 // 静态方法new 有问题 public static voi ...

  10. PHP连接数据库(mysql)

    前端链接后台,数据库几乎必不可少.所以本文总结了PHP链接数据库的常用方法步骤. 首先 链接数据库:mysqli_connect参数①主机地址 ②mysql用户名③nysql密码④选择连接的数据库⑤端 ...