您的位置:首页 > 其它

hdu 1258 Sum It Up(回溯算法)

2010-11-11 20:47 453 查看
题意:从给定的n个正整数中选出m个数(m <= n)使得这m个数的和为给定的total

解法:回溯

/*
Author: ACb0y
Date: 2010-11-11
ProblemId: hdu 1258 Sum It Up
Result: 3181578	2010-11-11 20:42:18	Accepted	1258	0MS	368K	1461 B	G++	ACb0y
*/
#include <iostream>
#include <algorithm>
#include <set>
#include <string>
using namespace std;
int total, n;
int data[15];
int ans[15];
int vis[15];
//使用set判重
set<string> s;
int Count;
bool cmp(int a, int b) {
return a > b;
}
string digit_to_str(int d)
{
string temp = "";
char c;
if (d == 0) {
return "0";
} else {
while (d != 0) {
c = d % 10 + '0';
temp = c + temp;
d /= 10;
}
}
return temp;
}
void dfs(int pos, int sum) {
int i, j;
if (sum == total && pos != 0) {
string temp = "";
for (i = 0; i < pos; ++i) {
if (i == 0) {
temp = digit_to_str(ans[i]);
} else {
temp = temp + "+" + digit_to_str(ans[i]);
}
}
if (s.find(temp) == s.end()) {
cout << temp << endl;
Count++;
s.insert(temp);
}
return;
} else {
for (i = pos; i < n; ++i) {
if ((!vis[i] && sum + data[i] <= total && data[i] <= ans[pos - 1]) || pos == 0) {
vis[i] = 1;
ans[pos] = data[i];
dfs(pos + 1, sum + data[i]);
vis[i] = 0;
}
}
}
}
int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt", "r", stdin);
#endif
int i, j;
int sum;
while (scanf("%d%d", &total, &n) != EOF) {
if (n == 0) {
break;
} else {
for (i = 0; i < n; ++i) {
scanf("%d", &data[i]);
}
}
cout << "Sums of " << total << ":" << endl;
sort(data, data + n, cmp);
memset(vis, 0, sizeof(vis));
s.clear();
Count = 0;
dfs(0, 0);
if (Count == 0) {
cout << "NONE" << endl;
}
}
return 0;
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 up string 2010 c