1 条题解
-
0
参考答案:
#include<iostream> using namespace std; const int N = 10; int p[N], st[N], a[N];//p存储合法情况 int n;// state st存储(0/1)表示每个数字是否被使用过 int ans = 1e9; void dfs(int u)//u是暴力枚举到的位置 { if (u > 6)//超过n时 是一种合法情况 直接取min { ans = min(ans, abs((p[1] + p[2] + p[3]) - (p[4] + p[5] + p[6]))); return; } for (int i = 1; i <= 6; ++i) { if (!st[i])//如果这个数字没有使用过那么放在u这个位置 { st[i] = 1;//把这个数字按死后面不能用 p[u] = a[i];//u这个位置放i这个数字 dfs(u + 1);//暴搜下一个位置 //dfs结束时也就意味着这个数字放在这个位置的所有情况全部枚举完毕 //比如这个位置放的是3, 3 2 1 ,3 1 2 //接下来这个位置该放 2 1 的情况了而且后面位置可以放3所以st[3]=1的状态该解除了 //所以下面恢复现场也就是以前是什么样(dfs(u+1)上面 我们限制的地方)就恢复什么样 //pi限制的这个位置放3解除掉sti限制的以后不能放3解除掉 p[u] = 0; st[i] = 0; } } } int main() { for (int i = 1; i <= 6; ++i) cin >> a[i]; dfs(1); cout << ans << endl; return 0; }
- 1
信息
- ID
- 37
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 10
- 已通过
- 3
- 上传者