poj 1416 (hdu 1539)Shredding Company:剪枝搜索
题目大意是有一个分割机,可以把一串数字分割成若干个数字之后求和,题目输入一个数字上界和待分割的数字,让我们求出分割后数字之和在不超过给定max的情况下的最大值,并且给出分割方案,如果没有分割方案,则输出error,如果有多种方案则输出rejected。
这是个搜索题,深搜就可以求解,但是有一些剪枝的方案,题目讨论区说貌似不剪枝也能过,没试过,我一开始就写了有剪枝的,下面说一下一些剪枝方案:
假设题目输入格式为max number
1,如果number各个位相加以后仍然大于max,则error,这是在搜索之前判断的
2,如果number <= max 那么number就是切割方案,因为number能切出来的最大数是它本身,最小数就是各位之和了
3.,搜索过程中动态改变下界,如果我们之前搜索过的结果中有一个结果ans出现了,那么当我们搜索时,我们首先判断前面所有裁剪的总和sum和剩下的那一段x的和,如果小于之前求出的ans,那么后面将不再拆分 x 因为再怎么拆分也不会得到更接近max的ans了,相反,如果sum + x大于ans并且小于max,那么直接把ans更新为sum + x,也不用继续裁剪x了,因为x裁剪出来的也必定小于x,所以这个剪枝个人感觉还是比较强力的,只有sum + x > max的时候才能往下搜索,需要注意的是104会分成1
0 4和1 04,同样也会有140分解成1 4 0的问题,所以我用了两个标记来区分这两种情况,所以写的比较绕
0MS代码:
#include<stdio.h>
int stack[20];
int max;
int top;
int len;
bool f;
int ans[20];
void dfs(int it, char * num, int sum, int n)
{
if(!num[it])
return ;
int i;
int numb = 0;
for(i = it; num[i]; i++)
{
int j;
bool mark = false;
numb = 0;
int number;
for(j = it; j <= i; j++)
{
numb *= 10;
numb += num[j] - '0';
}
if(num[i + 1] == '0' && num[i + 2] != 0)
mark = true;
if(num[i + 1] != 0)
sscanf(num + i + 1, "%d", &number);
else
number = 0;
if(number + numb + sum < max)
continue;
else if(number + numb + sum == max)
f = true;
else if(number + numb + sum > max && number + numb + sum <= n)
{
max = number + numb + sum;
if(mark == true)
f = true;
else
f = false;
stack[top ++] = numb;
stack[top ++] = number;
for(j = 0; j < top; j++)
ans[j] = stack[j];
len = top;
top -= 2;
continue;
}
stack[top++] = numb;
dfs(i + 1, num, sum + numb, n);
top --;
}
}
int main()
{
int n, m;
char num[20];
while(scanf("%d %d", &n, &m), n + m != 0)
{
if(m <= n)
{
printf("%d %d\n", m, m);
continue;
}
sprintf(num, "%d", m);
int i;
int sum = 0;
for(i = 0; num[i]; i++)
{
sum += num[i] - '0';
}
if(sum > n)
{
printf("error\n");
continue;
}
top = len = 0;
max = -1;
f = false;
dfs(0, num,0, n);
if(f == false)
{
printf("%d", max);
for(i = 0; i < len; i++)
printf(" %d", ans[i]);
printf("\n");
}
else
printf("rejected\n");
}
return 0;
}
poj 1416 (hdu 1539)Shredding Company:剪枝搜索的更多相关文章
- POJ 1416 Shredding Company 回溯搜索 DFS
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 6173 Accepted: 3361 ...
- HDU 2437 Jerboas (剪枝搜索)
题意:给定一幅图,图上有两种点T,P.......一只跳鼠在一个T点作为起始点,它想通过图上的路到达某个P点,P点满足如下要求: (1).到达P点的途中路径权值为k的倍数 (2).尽量让路径权值取最小 ...
- 【HDOJ】1539 Shredding Company
DFS. /* 1539 */ #include <iostream> #include <cstdio> #include <cstring> #include ...
- POJ 1198 / HDU 1401 Solitaire (记忆化搜索+meet in middle)
题目大意:给你一个8*8的棋盘,上面有四个棋子,给你一个初始排布,一个目标排布,每次移动,可以把一个棋子移动到一个相邻的空位,或者跨过1个相邻的棋子,在保证棋子移动不超过8次的情况下,问能否把棋盘上的 ...
- 搜索+剪枝 POJ 1416 Shredding Company
POJ 1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5231 Accep ...
- POJ 1416 Shredding Company【dfs入门】
题目传送门:http://poj.org/problem?id=1416 Shredding Company Time Limit: 1000MS Memory Limit: 10000K Tot ...
- Shredding Company (hdu 1539 dfs)
Shredding Company Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- POJ 1416:Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 4713 Accepted: 2714 ...
- poj1416 Shredding Company
Shredding Company Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 5379 Accepted: 3023 ...
随机推荐
- <1 小玩意(覆盖效果)
<!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...
- git 创建版本库
服务器安装后git后 1.在repositories仓库文件夹中执行git init aa.git --bare 创建aa的中心库(注意建立aa版本库时当前登录用户必须为git的相关用户,并保证/d ...
- HDU 4822----其实不会这个题
题目:http://acm.hdu.edu.cn/showproblem.php?pid=4822 并不会做这个题,题解说是LCA(最近公共祖先),并不懂,说一下我自己的思路吧,虽然没能实现出来. 题 ...
- NOSCRIPT标签的用处
NOSCRIPT标签用来定义在脚本未被执行时的替代内容.也可以用在检测浏览器是否支持脚本,若不支持脚本则可以显示NOSCRIPT标签里的innerText. eg:<body> ... . ...
- PHP数组操作汇总 php数组的使用技巧
对于Web编程来说,最重要的就是存取和读写数据了.存储方式可能有很多种,可以是字符串.数组.文件的形式等. 数组,可以说是PHP的数据应用中较重要的一种方式.PHP的数组函数众多,下面是我学习的小 ...
- Android 学习第7课,java android project 项目文档结构
src: 主要存放java源文件 gen:用于存放由开发工具自动生成的内容 R.java(很重要),用于登记各种资源的ID,编译器在你放入资源于自动生成的,程序员不需要自己去修改,是不能自己修改的 往 ...
- C# button 去边框
Button属性里找到FlatStyle属性:Flat FlatAppearance BorderSize:0;
- POJ 3176 简单DP
Cow Bowling Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 16448 Accepted: 10957 Descrip ...
- CF 600B Queries about less or equal elements --- 二分查找
CF 600B 题目大意:给定n,m,数组a(n个数),数组b(m个数),对每一个数组b中的元素,求数组a中小于等于数组该元素的个数. 解题思路:对数组a进行排序,然后对每一个元素b[i],在数组a中 ...
- H20的题——[noip2003]银河英雄传(并查集)
公元五八○一年,地球居民迁移至金牛座α第二行星,在那里发表银河联邦创立宣言,同年改元为宇宙历元年,并开始向银河系深处拓展. 宇宙历七九九年,银河系的两大军事集团在巴米利恩星域爆发战争.泰山压顶集团派宇 ...