您的位置:首页 > 其它

杭电--1258 深度搜索(sum it up)

2013-06-22 23:38 260 查看
DFS还是不太懂,递归是个硬伤啊。。。。

题目地址:http://acm.hdu.edu.cn/showproblem.php?pid=1258

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <cstdio>

using namespace std;

vector<int> digits(13);    //出现的数字
vector<int> digits_num(13);  //对应的个数
int m = 0;  //digits中具体有m个数
vector<int> f(13);   //遍历搜索时候取得digits的数目
bool out = false;  //如果out是true说明有输出项

int sum;

void DFS(int start);

int main()
{
int n;
while(cin >> sum >> n)
{
out = false;
m = 0;
if(sum ==0 && n==0)
break;

//输入值,并初始化digits和digits_num数组
for(int i=0; i<n; i++)
{
if(i == 0)
{

cin >> digits[m];
digits_num[m] = 1;
m++;
}
else
{
int k;
cin >> k;
if(k == digits[m-1])
{
digits_num[m-1]++;
}
else
{
digits[m] = k;
digits_num[m] = 1;
m++;
}
}
}

//        测试,输出digits和digits_num数组
//        copy(digits.begin(), digits.end(), ostream_iterator<int>(cout, "\t"));
//        cout << endl;
//        copy(digits_num.begin(), digits_num.end(), ostream_iterator<int>(cout, "\t"));

//        深度搜索

cout << "Sums of " << sum << ":" << endl;
DFS(0);
if(out == false)
cout << "NONE" << endl;
}
return 0;
}

void DFS(int start)
{
int tot = 0;
//    cout << "s=" << s << endl;
//    cout << "m=" << m << endl;
//计算和tot
//     cout << "start:" << endl;
for(int i=0; i<m; i++)
{
if(f[i] != 0)
tot = tot + digits[i] * f[i];

//        cout << "f[" << i << "]=" << f[i] << endl;

}
//    cout << "tot=" << tot << endl;
//    cout << "end:" << endl << endl;
//    getchar();
//    getchar();

//剪枝
if(tot > sum)
return;

//打印结果
if(tot == sum)
{
int flag = true;
for(int i=0; i<m; i++)
{
if(f[i] != 0 && flag)
{
flag = false;
for(int j=0; j<f[i]; j++)
{
if(j == 0)
cout << digits[i];
else
cout << "+" << digits[i];
}
}
else
{
if(f[i] != 0)
{
for(int j=0; j<f[i]; j++)
cout << "+" << digits[i];
}
}
}
cout << endl;
out = true;
return ;
}

for(int i=start; i<m; i++)
{
for(int j=digits_num[i]; j>0; j--)
{
f[i] = j;
DFS(i+1);
}
f[i] = 0;
}
}

/*
4 6 4 3 2 2 1 1
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: