Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 4019 | Accepted: 2245 | Special Judge |
Description
- a0 = 1
- am = n
- a0 < a1 < a2 < ... < am-1 < am
- For each k (1<=k<=m) there exist two (not necessarily different) integers i and j (0<=i, j<=k-1) with ak=ai+aj
You are given an integer n. Your job is to construct an addition chain for n with minimal length. If there is more than one such sequence, any one is acceptable.
For example, <1,2,3,5> and <1,2,4,5> are both valid solutions when you are asked for an addition chain for 5.
Input
Output
Hint: The problem is a little time-critical, so use proper break conditions where necessary to reduce the search space.
Sample Input
5 7 12 15 77 0
Sample Output
1 2 4 5 1 2 4 6 7 1 2 4 8 12 1 2 4 5 10 15 1 2 4 8 9 17 34 68 77
#include <stdio.h>
#include <string.h>
int num;
int sequence[101], min, best[101], sort[101];
void find(int n)
{
int i;
if (n > min)
return ;
if (sequence[n] == num) {
for (i = 0; i <= n; i++)
best[i] = sequence[i];
best[i] = 0;
min = n;
return;
}
for (i = 0; i <= n; i++) {
sequence[n+1] = sequence[i]+sequence[n];
if (sequence[n+1] > num)
break;
if (n+1 > sort[sequence[n+1]])
continue;
else
sort[sequence[n+1]] = n+1;
find(n+1);
}
}
int main()
{
int i;
sequence[0] = 1;
num = 0;
memset(sort, 100, sizeof(sort));
while (scanf("%d", &num), num) {
min = 100;
find(0);
for (i= 0; best[i]; i++)
printf("%d ", best[i]);
printf("\n");
}
return 0;
}