HDU1539Shredding Company(DFS+保存最优路径)
2018-01-17 12:28
211 查看
题目大意:给你一个目标值和一段数字串,你要把这个串进行分割求和,让结果趋近于目标值并且不大于他
思路:搜索,每次一个x代表你要分割串的头位置,即最高位,sum代表在x位置之前分割求和的结果,k代表最优答案的位数
小结:一开始是想用一个栈保存最优答案的值,但是直接在每次搜的时候就改变这个栈了,结果最优答案可能被更替,导致一晚上没能解决这个问题,忘了还可以用一个中间数组进行存值,等到要改变最优值时再换答案。基础做法!!牢记
加上按位和的剪枝从15ms变成0ms代码
AC代码如下:#include<cstdio>
#include<stdio.h>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
char s[10000],c;
int data[10000],n,flag,MAX,size,t,answer[10000],temp[10000];
void dfs(int x,int sum,int k)
{
if(x==n)
{
if(MAX<=sum && sum<=size)
{
if(flag && MAX<sum) //之前有重复并且此次要更新
flag=0;
else if(MAX==sum) //此次重复
flag=1;
MAX=sum;
t=k;
for(int i=0;i<t;i++)
answer[i]=temp[i];
}
return ;
}
int i,l=0;
for(i=x;i<n;i++)
{
l=l*10+data[i];
if(l>=size) break; //发现到这里已经比那个想要靠近的数来得大或者等于了 之后就不用切了
temp[k]=l;
dfs(i+1,sum+l,k+1);
}
return ;
}
int main()
{
int i,l,k;
while(~scanf("%d%s",&size,s) && (size||strcmp(s,"0")))
{
n=strlen(s);
for(MAX=i=l=flag=t=k=0;i<n;i++)
{
data[i]=s[i]-'0';
k+=data[i];
if(data[i]>=size || k>size)
{
flag=1;
break;
}
l=l*10+data[i];
}
if(flag) //剪枝,如果数中有某段数本身或者按位和大于目标就去掉
puts("error");
else if(l==size)
printf("%d %d\n",l,size);
else
{
dfs(0,0,0);
if(flag)
puts("rejected");
else
{
printf("%d",MAX);
for(i=0;i<t;i++)
printf(" %d",answer[i]);
printf("\n");
}
}
}
return 0;
}
思路:搜索,每次一个x代表你要分割串的头位置,即最高位,sum代表在x位置之前分割求和的结果,k代表最优答案的位数
小结:一开始是想用一个栈保存最优答案的值,但是直接在每次搜的时候就改变这个栈了,结果最优答案可能被更替,导致一晚上没能解决这个问题,忘了还可以用一个中间数组进行存值,等到要改变最优值时再换答案。基础做法!!牢记
加上按位和的剪枝从15ms变成0ms代码
AC代码如下:#include<cstdio>
#include<stdio.h>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<stack>
using namespace std;
char s[10000],c;
int data[10000],n,flag,MAX,size,t,answer[10000],temp[10000];
void dfs(int x,int sum,int k)
{
if(x==n)
{
if(MAX<=sum && sum<=size)
{
if(flag && MAX<sum) //之前有重复并且此次要更新
flag=0;
else if(MAX==sum) //此次重复
flag=1;
MAX=sum;
t=k;
for(int i=0;i<t;i++)
answer[i]=temp[i];
}
return ;
}
int i,l=0;
for(i=x;i<n;i++)
{
l=l*10+data[i];
if(l>=size) break; //发现到这里已经比那个想要靠近的数来得大或者等于了 之后就不用切了
temp[k]=l;
dfs(i+1,sum+l,k+1);
}
return ;
}
int main()
{
int i,l,k;
while(~scanf("%d%s",&size,s) && (size||strcmp(s,"0")))
{
n=strlen(s);
for(MAX=i=l=flag=t=k=0;i<n;i++)
{
data[i]=s[i]-'0';
k+=data[i];
if(data[i]>=size || k>size)
{
flag=1;
break;
}
l=l*10+data[i];
}
if(flag) //剪枝,如果数中有某段数本身或者按位和大于目标就去掉
puts("error");
else if(l==size)
printf("%d %d\n",l,size);
else
{
dfs(0,0,0);
if(flag)
puts("rejected");
else
{
printf("%d",MAX);
for(i=0;i<t;i++)
printf(" %d",answer[i]);
printf("\n");
}
}
}
return 0;
}
相关文章推荐
- 入门经典-习题7-1,109-uva208消防车-DFS,并查集,打印路径,利用set保存边,字典序,STL⭐⭐⭐⭐⭐复杂度:3
- 深度优先算法(DFS)遍历有向无环图计算最优路径
- 哈密顿绕行世界问题 简单的dfs()注意保存输出路径
- poj 3984 BFS+DFS(保存路径)
- 最优匹配,增广路径dfs几乎与二分匹配一摸一样 --不过就是多了调整过程而已 【转自旧博】
- 【二叉树】DFS计算路径和,保存路径【113. Path Sum II】【112. Path Sum】
- HDOJ 1026 dfs路径保存
- 组合数 【DFS】(保存路径)
- 保存一棵树根到叶子之和为给定值的所有路径的DFS解法
- 飞越原野 DFS寻找最优路径
- CF-29D - Ant on the Tree(DFS+路径保存回扫)
- CF-29D - Ant on the Tree(DFS+路径保存回扫)
- 在图上寻找最优路径(DFS)
- poj 2965 dfs+保存路径
- Mac自带截屏软件截图的保存路径更改以及截图的格式更改
- java生成文件的默认保存路径与System.getProperty("user.dir")
- lightoj1094——Farthest Nodes in a Tree(dfs+最长路径)
- dedecms二次开发--修改栏目文件保存路径 (栏目ID命名)
- 单源最大权路径<DFS>
- Poj 3984 迷宫问题(BFS+DFS打印路径)