题目链接: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. C# 依赖注入那些事儿

    原文地址:http://www.cnblogs.com/leoo2sk/archive/2009/06/17/1504693.html 里面有一个例子差了些代码,补全后贴上. 3.1.3 依赖获取 u ...

  2. DataTable--数据生成datatable

    将数据库查出的数据生成datatable 我们一般将数据库查询出的数据用实体接受在泛型集合,然后遍历集合,以将数据绑定到前台展示,在很多情况下,泛型集合不如datatable更方便将数据操作,这里简单 ...

  3. boot中 Quartz注入spring管理类失败

    在项目中用到了Quartz,想在里面实现业务操作发现sping类注入总是失败.后来网上查询了一下解决办法.下面把我成功解决问题的这个版本发出来,大家一起学习一下. 在quartz 会发现 job中无法 ...

  4. enum-枚举当做key-value业务使用

    1.枚举当做key-value业务使用 package com.uwillbe.pad.enums; import java.util.ArrayList; import java.util.List ...

  5. ISE软件报错

    ISE弹出如下报错并关闭程序或在编译时出现PATH类报错 一,解决办法 本人自己试了一下  E:\ISE\14.7\ISE_DS\settings64.bat E:\ISE\14.7\ISE_DS\I ...

  6. python 多线程操作数据库

    如果使用多线程操作数据库,容易引起多用户操作锁表 OperationalError: (2013, 'Lost connection to MySQL server during query') 使用 ...

  7. jdbctemplate 批量插入

    public void batchImport(List<Map<String, Object>> list) { String sql = "insert into ...

  8. PHP 在 Mac 的安装之路

    半年前本以为有一些 Apache 和 PHP 的安装经验,今天在 Mac 上还是踩了很多坑. 坦诚地讲,这东西入门成本比 Node,Python 入门成本真的是大很多. Apache 的编译安装就是那 ...

  9. oracle 创建包体的一些问题

    1. PLS-00201:必须声明标识符'A1' PLS-00304: 如果没有说明, 则无法编译'A1'主体 解决办法: 用sysdba身份 把A1包的执行权限给这个用户. 举例: 1.C:\Use ...

  10. 重建二叉树(python)

    题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...