题目传送门:http://poj.org/problem?id=1416

Shredding Company

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 6860   Accepted: 3710

Description

You have just been put in charge of developing a new shredder for the Shredding Company Although a "normal" shredder would just shred sheets of paper into little pieces so that the contents would become unreadable, this new shredder needs to have the following unusual basic characteristics.

1.The shredder takes as input a target number and a sheet of paper with a number written on it.

2.It shreds (or cuts) the sheet into pieces each of which has one or more digits on it.

3.The sum of the numbers written on each piece is the closest possible number to the target number, without going over it.

For example, suppose that the target number is 50, and the sheet of paper has the number 12346. The shredder would cut the sheet into four pieces, where one piece has 1, another has 2, the third has 34, and the fourth has 6. This is because their sum 43 (= 1 + 2 + 34 + 6) is closest to the target number 50 of all possible combinations without going over 50. For example, a combination where the pieces are 1, 23, 4, and 6 is not valid, because the sum of this combination 34 (= 1 + 23 + 4 + 6) is less than the above combination's 43. The combination of 12, 34, and 6 is not valid either, because the sum 52 (= 12 + 34 + 6) is greater than the target number of 50. 
 
Figure 1. Shredding a sheet of paper having the number 12346 when the target number is 50

There are also three special rules :

1.If the target number is the same as the number on the sheet of paper, then the paper is not cut.

For example, if the target number is 100 and the number on the sheet of paper is also 100, then

the paper is not cut.

2.If it is not possible to make any combination whose sum is less than or equal to the target number, then error is printed on a display. For example, if the target number is 1 and the number on the sheet of paper is 123, it is not possible to make any valid combination, as the combination with the smallest possible sum is 1, 2, 3. The sum for this combination is 6, which is greater than the target number, and thus error is printed.

3.If there is more than one possible combination where the sum is closest to the target number without going over it, then rejected is printed on a display. For example, if the target number is 15, and the number on the sheet of paper is 111, then there are two possible combinations with the highest possible sum of 12: (a) 1 and 11 and (b) 11 and 1; thus rejected is printed. In order to develop such a shredder, you have decided to first make a simple program that would simulate the above characteristics and rules. Given two numbers, where the first is the target number and the second is the number on the sheet of paper to be shredded, you need to figure out how the shredder should "cut up" the second number.

Input

The input consists of several test cases, each on one line, as follows :

tl num1 
t2 num2 
... 
tn numn 
0 0

Each test case consists of the following two positive integers, which are separated by one space : (1) the first integer (ti above) is the target number, (2) the second integer (numi above) is the number that is on the paper to be shredded.

Neither integers may have a 0 as the first digit, e.g., 123 is allowed but 0123 is not. You may assume that both integers are at most 6 digits in length. A line consisting of two zeros signals the end of the input.

Output

For each test case in the input, the corresponding output takes one of the following three types :

sum part1 part2 ... 
rejected 
error

In the first type, partj and sum have the following meaning :

1.Each partj is a number on one piece of shredded paper. The order of partj corresponds to the order of the original digits on the sheet of paper.

2.sum is the sum of the numbers after being shredded, i.e., sum = part1 + part2 +...

Each number should be separated by one space. 
The message error is printed if it is not possible to make any combination, and rejected if there is 
more than one possible combination. 
No extra characters including spaces are allowed at the beginning of each line, nor at the end of each line. 

Sample Input

50 12346
376 144139
927438 927438
18 3312
9 3142
25 1299
111 33333
103 862150
6 1104
0 0

Sample Output

43 1 2 34 6
283 144 139
927438 927438
18 3 3 12
error
21 1 2 9 9
rejected
103 86 2 15 0
rejected

Source

题意概括:

给一个目标值 T , 和一串数字(最多六个),切分这串数字使得最后切出来的数字和最接近T(但不可以大于T)

一、如果目标值和原数字值相同不可以切分;

二、如果最小的切分结果都大于 T 则输出 “error”;

三、如果切分的最优结果不唯一则输出“rejected”;

四、如果可切分并且结果唯一,输出最优值和切分结果。

解题思路:

我们知道如果原字串长度为 N ,则我们最多可以切 N-1 次;

根据数据范围可直接DFS,无需剪枝,暴力遍历所有可能找出最优值。

AC code:

///POJ 1416 dfs
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
#define INF 0x3f3f3f3f
#define ll long long int
using namespace std;
int dis[];
int num[], t[], v[];
char ch[];
int max_N, cnt;
int tar, top, N, len; void dfs(int x, int m, int cap)
{
int y;
bool flag;
if(x==len) ///到达末尾
{
if(max_N > m) return; ///当前值小于最优值
flag = ;
for(int i = ; i < cap; i++) ///判断两种切分是否相同
if(t[i]!=v[i]) flag = ;
if(max_N < m) ///当前值优于最优值
{
max_N = m;
cnt = cap;
for(int i = ; i < cap; i++) t[i]=v[i];
}
if(flag) dis[m]++; ///记录最优值 m 的出现次数
return;
}
y = ;
for(int i = x; i < len; i++) ///从 X 开始遍历当前这一段的不同长度的结果
{
y = y*+num[i];
if(y+m<=tar) ///这一段可以加上num[ i ]
{
v[cap] = y;
dfs(i+, y+m, cap+); ///进入下一段
}
else break;
}
} int main()
{
while(~scanf("%d", &tar))
{
scanf("%s", &ch);
if(tar == && ch[] == '') break;
len = ;
memset(dis, , sizeof(dis));
memset(v, , sizeof(v));
memset(t, , sizeof(t));
int sum = ;
for(int i = ; ch[i] != '\0'; i++)
{
num[i] = ch[i]-'';
N = N*+num[i];
sum+=num[i];
len++;
}
if(sum > tar || (sum == tar && top>)) {printf("error\n"); continue;}
if(N == tar) {printf("%d\n", N); continue;}
max_N = , cnt = ;
dfs(, , );
if(dis[max_N]!=) printf("rejected\n");
else
{
printf("%d", max_N);
for(int i = ; i < cnt; i++)
printf(" %d", t[i]);
puts("");
}
}
return ;
}

POJ 1416 Shredding Company【dfs入门】的更多相关文章

  1. poj 1416 Shredding Company( dfs )

    我的dfs真的好虚啊……,又是看的别人的博客做的 题目== 题目:http://poj.org/problem?id=1416 题意:给你两个数n,m;n表示最大数,m则是需要切割的数. 切割m,使得 ...

  2. 搜索+剪枝 POJ 1416 Shredding Company

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

  3. POJ 1416 Shredding Company 回溯搜索 DFS

    Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6173   Accepted: 3361 ...

  4. OpenJudge 2803 碎纸机 / Poj 1416 Shredding Company

    1.链接地址: http://poj.org/problem?id=1416 http://bailian.openjudge.cn/practice/2803 2.题目: 总时间限制: 1000ms ...

  5. POJ 1416 Shredding Company

    题目: http://poj.org/problem?id=1416 又16ms 1A了,这人品... #include <stdio.h> #include <string.h&g ...

  6. POJ1416——Shredding Company(DFS)

    Shredding Company DescriptionYou have just been put in charge of developing a new shredder for the S ...

  7. Shredding Company(dfs)

    http://poj.org/problem?id=1416 题意:将一个数分成几部分,使其分割的各个数的和最大并且小于所给的数. 凌乱了..参考的会神的代码..orz... #include < ...

  8. POJ1416 Shredding Company(dfs)

    题目链接. 分析: 这题从早上调到现在.也不算太麻烦,细节吧. 每个数字都只有两种状态,加入前一序列和不加入前一序列.DFS枚举. #include <iostream> #include ...

  9. POJ 1416:Shredding Company

    Shredding Company Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4713   Accepted: 2714 ...

随机推荐

  1. VUE项目引入微信jssdk

    npm i -S weixin-js-sdkimport wx from 'weixin-js-sdk'

  2. (转)netstat 命令详解

    netstat 命令详解  原文:https://www.cnblogs.com/xieshengsen/p/6618993.html netstat命令是一个监控TCP/IP网络的非常有用的工具,它 ...

  3. 使用jxl读取excel内容,并转换成Json,用于Datagrid

    一.上传excel文件,得到InputStream,由InputStream得到Jxl中的Workbook,取出内容,存到二维数组中. 1.使用 Jquery Uploadify 插件(http:// ...

  4. 如何在ThinkPHP中开启调试模式

    1.为什么使用调试模式? 因为调试会在我们的模板页的最后增加一些trace信息. 2.什么是trace信息? 是ThinkPHP为我们提供好的一些包含了系统运行时间.占用内存.加载时间.请求的协议.. ...

  5. nyoj 1023——还是回文——————【区间dp】

    还是回文 时间限制:2000 ms  |  内存限制:65535 KB 难度:3   描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一 ...

  6. 【PPTP】windows & linux 安装pptp

    1.Windows下安装 PPTP 打开网络和共享中心 更改适配器配置 按一下alt,之后,点击左上角的文件---->新建传入连接 在新建传入连接这边点击添加用户 如输入用户名:Evelyn  ...

  7. 净推荐值(NPS):用户忠诚度测量的基本原理及方法

    文章分享了一个衡量用户与产品或服务之间关系的指标:NPS,干货满满,希望对你有益. 初识NPS 作为互联网行业的用户体验从业者,我们都或多或少会接触一些衡量用户与产品或服务之间关系的指标,常见的指标如 ...

  8. js之strict模式

    JavaScript在设计之初,为了方便初学者学习,并不强制要求用var申明变量.这个设计错误带来了严重的后果:如果一个变量没有通过var申明就被使用,那么该变量就自动被申明为全局变量: i = 10 ...

  9. 轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理

    转载:https://blog.csdn.net/yanyan19880509/article/details/52435135 前言 前面介绍了java中排它锁,共享锁的底层实现机制,本篇再进一步, ...

  10. 从零开始的全栈工程师——ajax

    AJAX AJAX 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术. AJAX = Asynchronous JavaScript and XML. AJAX 是一种用于创建快速动态网页 ...