您的位置:首页 > 其它

HDU 1258 Sum It Up

2017-03-19 23:15 330 查看
题目链接:戳这里

题目大意:给一个非递增有序数列,找到和为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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: