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
慢慢体会递归的强大!!!
题目链接: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; }
相关文章推荐
- hdu 1342+hdu 2660+hdu 2266+hdu 1704+hdu 1627+hdu 1539
- HDU 1342 Lotto 【DFS】
- DFS HDU 1342
- hdu 2660 Accepted Necklace dp / dfs
- HDU 1704 Rank floyd求传递闭包 || bfs
- HDU 1704 (搜索题)
- hdu 1342
- hdu 1342 Lotto (简单dfs)
- hdu 1704 传递闭包
- HDU-2266-How Many Equations Can You Find【交叉DFS】
- hdu--2660--二维费用背包
- hdu 2266 How Many Equations Can You Find
- hdu 1342 Lotto(组合数搜索)
- 【HDU 2266 How Many Equations Can You Find】+ DFS
- HDU 1704 rank(floyd闭包+剪枝)
- HDU:2266 How Many Equations Can You Find(深搜+DFS)
- HDU 2660 Accepted Necklace DFS || 多重背包
- HDU 1342 Lotto (dfs)
- hdu 1704 (Floyd 传递闭包)
- HDOJ(HDU).2266 How Many Equations Can You Find (DFS)