开始用递归写了一个,总是TLE,不知道怎么改。。。
//貌似是没剪枝,导致超时
#include
#include
#include
#include
using namespace std;
int n, max, wager[1000], flag[1000];//flag数组标记用与否,用了置为1
int cmp(const int &a, const int &b)
{
return a > b;
}
int dfs(int w, int j, int count)//j记录当前的位置,从0开始
{
int i;
if(w == 0)
{
if(count == 3)
return 1;
else
return 0;
}
for(i = 0; i < n; i++)
{
if(i == j)
continue;
if(!flag[i])
{
if(wager[i] <= w && count < 3)
{
flag[i] = 1;
if(dfs(w - wager[i], j, count + 1))
return 1;
flag[i] = 0;
}
}
}
return 0;
}
int main(void)
{
int i;
while(scanf("%d", &n), n)
{
memset(flag, 0, sizeof(flag));
for(i = 0; i < n; i++)
scanf("%d", &wager[i]);
if(n < 4)
{
printf("no solution\n");
continue;
}
sort(wager, wager + n, cmp);//从大到小排序
for(i = 0; i < n; i++)
{
if(dfs(wager[i], i, 0))
{
printf("%d\n", wager[i]);
break;
}
}
if(i == n)
printf("no solution\n");
}
//system("pause");
}
/*起初WA是因为没有全部遍历,以为只要遍历到n-4项即可
却忽略了测试集为5 9 8 7 6 -11的情况*/
#include
#include
int n, a[1111];
int cmp(const void *x, const void *y)
{
return *(int *)y - *(int *)x;
}
int binary_search(int number, int left, int right)//二分查找第三个数
{
while(left <= right)
{
int mid = (left + right) / 2;
if(a[mid] == number)
return 1;
else if(a[mid] > number)
left = mid + 1;
else
right = mid - 1;
}
return 0;
}
int main(void)
{
int i, j, k, num, flag;
while(scanf("%d", &n), n)
{
flag = 0;
for(i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
if(n < 4)
{
printf("no solution\n");
continue;
}
qsort(a, n, sizeof(int), cmp);
for(i = 0; i < n; i++)
{
if(flag)
break;
for(j = 0; j < n; j++)
{
if(flag)
break;
if(i == j)
continue;
for(k = 0; k < n; k++)
{
if(k == i || k == j)
continue;
num = a[i] - a[j] - a[k];
if(num == a[i] || num == a[j] || num == a[k])//例如a[i]=12,a[j]=6,a[k]=3
continue;
if(binary_search(num, 0, n - 1))
{
printf("%d\n", a[i]);
flag = 1;
break;
}
}
}
}
if(!flag)
printf("no solution\n");
}
//system("pause");
}