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; }
相关文章推荐
- HDU 1258 (DFS) Sum It Up
- HDU 1258 Sum It Up
- hdu 1258 Sum It Up
- HDU 1258 Sum It Up 深搜
- hdu 1258 Sum It Up (dfs+路径记录)
- hdu 1258 Sum It Up
- HDU 1258 Sum it up
- hdu 1258 Sum It Up
- HDU 1258 Sum It Up
- hdu 1258 Sum It Up
- HDU 1258 Sum It Up
- Sum It Up(HDU 1258)
- HDU 1258 Sum It Up (DFS)
- HDU 1258 Sum It Up
- hdu 1258 Sum It Up
- [置顶] hdu-1258 Sum It Up(dfs+去重)
- hdu 1258 Sum It Up(dfs)
- HDU 1258 Sum It Up (POJ 1564)
- HDU 1258 Sum It Up
- hdu 1258 Sum It Up (dfs+路径记录)