|
第6题如果界定得好其实非常快
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
static int top = 0;
static int nums[20] = {0};
static int nums_count = 0;
static int used_sums[200];
static int values[100] = {0};
static int best = 0;
static int can_use(int n)
{
for(int i = 0; i < nums_count; i++)
{
if(used_sums[nums[i] + n] != 0) return 0;
}
return 1;
}
static void use_num(int n)
{
for(int i = 0; i < nums_count; i++)
{
used_sums[n + nums[i]] = 1;
}
}
static void unuse_num(int n)
{
for(int i = 0; i < nums_count; i++)
{
used_sums[n + nums[i]] = 0;
}
}
static void print_sol()
{
for(int i = 0; i < nums_count; i++)
{
printf("%d ", nums[i]);
}
printf("best = %d below %d.\r\n", best, top);
}
static void search(int max, int sum)
{
for (int n = max; n >= 1; n--)
{
if (sum + n + values[n - 1] <= best) continue;
if (can_use(n))
{
use_num(n);
nums[nums_count++] = n;
if(sum + n > best)
{
best = sum + n;
print_sol();
}
search(n - 1, sum + n);
nums_count--;
unuse_num(n);
}
}
}
int main(void)
{
for (int i = 1; i < 100; i++)
{
top = i;
nums_count = 0;
for(int j = 0; j < 200; j++) used_sums[j] = 0;
best = 0;
search(i, 0);
values[i] = best;
print_sol();
}
return 0;
} |
|