HDU 1258 Sum It Up
2017-03-19 23:15
330 查看
题目链接:戳这里
题目大意:给一个非递增有序数列,找到和为Sums的等式。
分析:很显然这是一道搜索题,但是其中有几点需要注意:1、搜索路径的保存,刚开始我根本不知道怎样保存路径,纠结,。。用数组保存,满足条件时输出,然后回溯,有可以更新这个数组,神奇。。 2、这个搜索过程是一个树形结构,其中搜索到同层节点值相同时,应剪枝,很重要。
源代码:
题目大意:给一个非递增有序数列,找到和为Sums的等式。
分析:很显然这是一道搜索题,但是其中有几点需要注意:1、搜索路径的保存,刚开始我根本不知道怎样保存路径,纠结,。。用数组保存,满足条件时输出,然后回溯,有可以更新这个数组,神奇。。 2、这个搜索过程是一个树形结构,其中搜索到同层节点值相同时,应剪枝,很重要。
源代码:
#include<iostream> #include<stdio.h> #include<string> #include<string.h> #include<cstring> #include<stack> #include<queue> #include<algorithm> #include<math.h> #include<vector> #include<iomanip> #include<map> #include<list> using namespace std; int Sums,n,a[15],b[15],flag; void DFS(int x,int count,int sum) { if(sum>Sums)return; if(sum==Sums) { flag=1; for(int i=1;i<count;i++) { if(i==1) cout<<b[i]; else cout<<"+"<<b[i]; } cout<<endl; } int last=-1; for(int i=x;i<=n;i++) { if(last!=a[i]) {//这里需要注意,是和该节点同层的上一个兄弟节点比较 b[count]=a[i];//b数组保存搜索路径,回溯时更新 last=a[i]; DFS(i+1,count+1,sum+a[i]); } } } int main() { while(cin>>Sums>>n,Sums+n) { flag=0; for(int i=1;i<=n;i++) cin>>a[i]; printf("Sums of %d:\n",Sums); DFS(1,1,0); if(flag==0) printf("NONE\n"); } return 0; }
相关文章推荐
- HDU-1258-Sum It Up
- hdu 1258 Sum It Up(回溯算法)
- (step4.3.4)hdu 1258(Sum It Up——DFS)
- HDU 1258 Sum It Up
- HDU1258 Sum It Up
- HDU 1258 Sum It Up(哈希表判重)
- HDU 1258 - Sum It Up
- hdu 1258 Sum It Up
- 【DFS】poj 1564 Sum It Up(hdu 1258)
- HDU 1258 Sum It Up
- HDU 1258 Sum it up 回溯法 暴力
- HDU1258 Sum It Up
- HDU 1258 Sum It Up 深搜
- sum it up hdu 1258
- HDU 1258 Sum It Up(DFS)
- HDU 1258 Sum It Up(Dfs)
- HDU 1258 sum it up
- HDU 1258 Sum It Up
- (step4.3.4)hdu 1258(Sum It Up——DFS)
- hdu 1258 Sum It Up