回溯 + 求下一个排列
#include <iostream>
#include <algorithm>
using namespace std;
int num[5];
bool flag;
void dfs(int cur,int sum)
{
if(cur == 5)
{
if(sum == 23)
flag = true;
}
else
{
dfs(cur + 1,sum + num[cur]);
dfs(cur + 1,sum * num[cur]);
dfs(cur + 1,sum - num[cur]);
}
}
int main()
{
while(cin >> num[0] >> num[1] >> num[2] >> num[3] >> num[4],
num[0] + num[1] + num[2] + num[3] + num[4])
{
flag = false;
sort(num,num + 5);
do
dfs(1,num[0]);
while(next_permutation(num,num + 5) && !flag);
if(flag)
cout<<"Possible"<<endl;
else
cout<<"Impossible"<<endl;
}
return 0;
}
本文介绍了解决UVa10344-23outof5问题的方法,采用回溯算法结合求下一个排列的方式进行解答。通过递归地尝试加法、乘法和减法操作,检查是否能从给定的五个数中得到总和为23的组合。

707

被折叠的 条评论
为什么被折叠?



