回溯法的简单应用。
题意是能不能用五个数字凑出23.
不过后来用别人的全排列的方法试了一下,竟然时间比回溯法少了N多,这是神马情况。。
再次吐槽一下UVa,十次上去九次是挂的(╯‵□′)╯ ┴─┴
#include <cstdio>
#include <cstring>
using namespace std;
int vis[10], num[10];
int a, b, c, d, e;
bool flag;
void DFS(int sum, int cur);
int main()
{
//freopen("input.txt", "r", stdin);
while (scanf("%d%d%d%d%d", &a, &b, &c, &d, &e) && a)
{
memset(vis, 0, sizeof(vis));
num[0] = a, num[1] = b; num[2] = c, num[3] = d, num[4] = e;
flag = false;
for (int i = 0; i < 5; i++)
{
vis[i] = 1;
DFS(num[i], 1);
if (flag)
break;
vis[i] = 0;
}
if (!flag)
printf("Impossible\n");
else
printf("Possible\n");
}
return 0;
}
void DFS(int sum, int cur)
{
if (flag)
return;
int i, j;
if (cur == 5)
{
if (sum == 23)
{
flag = true;
return;
}
}
else
for (i = 0; i < 5; i++)
{
if (!vis[i])
{
vis[i] = 1;
DFS(sum + num[i], cur + 1);
DFS(sum * num[i], cur + 1);
DFS(sum - num[i], cur + 1);
vis[i] = 0;
}
}
}