【问题描述】
w星球的长老交给小明一个任务:
1, 2, 3… 16 这16个数字分为两组。
要求:
1、这两组数字的和相同,
2、并且,两组数字的平方和也相同,
3、并且,两组数字的立方和也相同。
请你利用计算机的强大搜索能力解决这个问题。
并提交1所在的那个分组的所有数字。
这些数字要从小到大排列,两个数字间用一个空格分开。
即类似:1 4 5 8 … 这样的答案。
笨笨有话说:只要一个组的成员确定了,另一个组的成员也就确定了。枚举一个组的成员就可以了。凭直觉,两个组的成员数目不会差太多吧。
歪歪有话说:既然求 1 所在的那个组,那只要枚举剩余的成员就可以了。貌似都是8个成员的可能性很大啊。
【答案提交】
注意,只提交这一组数字,不要填写任何多余的内容。
答案:1 4 6 7 10 11 13 16
题解
DFS:
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 20;
int sum_1, sum_2, sum_3;
int st[N], a[N];
void dfs(int u)
{
if(u == 8 && a[0] == 1)
{
int t1 = 0, t2 = 0, t3 = 0;
for (int i = 0; i < 8; i ++)
{
t1 += a[i];
t2 += a[i] * a[i];
t3 += a[i] * a[i] * a[i];
}
if(t1 == sum_1 && t2 == sum_2 && t3 == sum_3)
{
sort(a, a + 8);
for (int i = 0; i < 8; i ++) cout << a[i] << " ";
cout << endl;
}
return;
}
for (int i = 1; i <= 16; i ++)
{
if(!st[i])
{
a[u] = i;
st[i] = true;
dfs(u + 1);
st[i] = false;
}
}
}
int main()
{
for (int i = 1; i <= 16; i ++)
{
sum_1 += i;
sum_2 += i * i;
sum_3 += i * i * i;
}
sum_1 /= 2, sum_2 /= 2, sum_3 /= 2;
dfs(0);
return 0;
}