您的位置:首页 > 其它

hdu 1342+hdu 2660+hdu 2266+hdu 1704+hdu 1627+hdu 1539

2013-05-10 17:01 405 查看
几道搜索水题,搜索要点就是不断剪枝,必要时还要不断恢复路径。

慢慢体会递归的强大!!!

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

View Code

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define MAXN 22//不是说测试数据不超过6位吗!!!一开始搞了个11的还过不了!!!!
char str[MAXN];
int n,len,relen,ans,l,tag;
int path[MAXN];
int repath[MAXN];

//递归+路径保存!!!
void dfs(int pos,int sum){
if(sum>n)return ;
if(pos==len){
if(sum<=n&&sum>=ans){
if(sum==ans)tag=2;//有多个最接近的值,就rejected
else {
ans=sum,relen=0,tag=1;
for(int i=0;i<l;i++)repath[relen++]=path[i];
}
}
return ;
}
int tmp=0;
for(int i=pos;i<len;i++){
tmp=tmp*10+str[i]-'0';
path[l++]=tmp;
dfs(i+1,sum+tmp);
l--;
}
}

int main(){
while(~scanf("%d%s",&n,str)){
if(n==0&&str[0]=='0')break;
len=strlen(str);
ans=0,l=0,tag=0;
memset(path,0,sizeof(path));
memset(repath,0,sizeof(repath));
dfs(0,0);
if(tag==0)puts("error");//都大于n就是error了。
else if(tag==2)puts("rejected");
else {
printf("%d",ans);
for(int i=0;i<relen;i++)printf(" %d",repath[i]);
printf("\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: