您的位置:首页 > 其它

HDU 1258 Sum It Up 深搜

2012-09-11 13:20 288 查看
http://acm.hdu.edu.cn/showproblem.php?pid=1258

题意:

  第一个数为sum,第二数N为后面有长度为N的序列(后一项小于等于前一项),要在这个序列中找出一组数加起来

等于sum。

坑爹:

  要输出所有的情况,但不能重复。

解法:

  用DFS的时候每次按顺序在num数组中找到一个值然后判断有没超过sum,没有的话就把它记录在save数组中,

然后再用review记录当前num[ i ] 的值,这样的话在DFS完成之后再找下一个值进行试探的时候就要判断是否与

review的值相同,相同的话就不用再进行DFS了(序列是严格的后一项小于等于前一项,所有review的值一旦改变了

就不会出现之前出现过的值了)。

View Code

#include<iostream>
using namespace std;

const int maxn = 12 + 10;
const int INF = 0x3fffffff;
int num[maxn];
int save[maxn];
int T;
int n;
int mark;

void DFS(int sum,int num_mark,int save_mark)
{
if(sum == T)                       //找到一组解
{
mark = 1;
int i;
for(i=1; i<save_mark; i++)
{
cout<<save[i];
if(i != save_mark - 1)
{
cout<<"+";
}
else
{
cout<<endl;
}
}
return ;
}
if(sum > T)
{
return ;
}

int i;
int review = INF;
for(i=num_mark; i<=n; i++)
{
if(sum + num[i] <= T && review != num[i])
{
sum = num[i] + sum;
save[save_mark] = num[i];
review=num[i];
DFS(sum,i+1,save_mark+1);  //因为序列是递减的,就算找不到review也不用还原,review更新过了就不会在遇到之前的值了.
sum = sum - num[i];
}
}

}

int main()
{
while(cin>>T>>n,n&&T)
{
int i;

for(i=1; i<=n; i++)
{
cin>>num[i];
}
mark = 0;
cout<<"Sums of "<<T<<":"<<endl;
DFS(0,1,1);
if(!mark)
{
cout<<"NONE"<<endl;
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: