您的位置:首页 > 其它

Sicily.1050. Numbers & Letters(DFS)

2012-12-27 16:27 197 查看
/*1050. Numbers & Letters(DFS)
大意:给出五个数字,通过他们其中的几个经过加减乘除操作。求出能够
达到的小于等于目标数的最大数
例如给出3 26 78 12 17 目标30 可以通过(78*3)-(12*17) = 30
思路:通过取两两数字进行操作。然后拿得到的结果再跟剩余的操作
例如 3 26 78 12 17
第一步:3+26 = 29,与剩下的78 12 17 29 构成新的数组进行下一次递归
用一个maxReached记录到达的最大数,当发现==targetNum时停止。
*/
#include <iostream>
#include <stdlib.h>
using namespace std;

int targetNum;
int maxReached;
bool ok = false;

void dfs(int a[], int n)
{
if(ok)
return;

if(a[n-1] <= targetNum && a[n-1] > maxReached ){
maxReached = a[n-1];
if(maxReached == targetNum)
{
ok = true;
return;
}
}
if(n ==1)
return;
int next[5];
int temp,m,k;
for(int i=0; i<n; i++)
{
for(int j=i+1; j<n; j++)
{
for(k=0, m=0; k<n; k++)
if( k!=i && k!=j)     //筛选掉已经用过的两个数
next[m++] = a[k];

next[m] = a[i] + a[j];
dfs(next, m+1);

next[m] = a[i] - a[j];
dfs(next, m+1);

next[m] = a[j] - a[i];
dfs(next, m+1);

next[m] = a[i] * a[j];
dfs(next, m+1);

if(a[i]!=0 && a[j]%a[i] == 0) {
next[m] = a[j]/a[i];
dfs(next, m+1);
}

if(a[j]!=0 && a[i]%a[j] == 0) {
next[m] = a[i]/a[j];
dfs(next, m+1);
}
}

}
}
int main ()
{
int n;
cin >> n;
int number[5];

for(int i=1; i<= n; i++)
{
ok = false;
maxReached = -10000000;
for(int k=0; k<5; k++)
cin >> number[k];
cin >> targetNum;
for(int k=0; k<5; k++)
{
if(number[k] <= targetNum && number[k] > maxReached)
maxReached = number[k];
}

dfs(number,5);
cout << maxReached << endl;
}
system("pause");
return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: