Starting with x andrepeatedly multiplying by x, we can compute x31 withthirty multiplications:
x2 = x x x, x3 = x2 x x, x4 = x3 x x, ... , x31 = x30 x x.
The operation of squaring can appreciablyshorten the sequence of multiplications. The following is a way tocompute x31 with eight multiplications:
x2 = x x x, x3 = x2 x x, x6 = x3 x x3, x7 = x6 x x, x14 = x7 x x7,
x15 = x14 x x, x30 = x15 x x15, x31 = x30 x x.
This is not the shortest sequence of multiplicationsto compute x31. There are many ways with only sevenmultiplications. The following is one of them:
x2 = x x x, x4 = x2 x x2, x8 = x4 x x4, x10 = x8 x x2,
x20 = x10 x x10, x30 = x20 x x10, x31 = x30 x x.
There however is no way to compute x31 withfewer multiplications. Thus this is one of the most efficient ways tocompute x31 only by multiplications.
If division is also available, we can finda shorter sequence of operations. It is possible to compute x31 withsix operations (five multiplications and one division):
x2 = x x x, x4 = x2 x x2, x8 = x4 x x4, x16 = x8 x x8, x32 = x16 xx16, x31 = x32 ÷ x.
This is one of the most efficient ways tocompute x31 if a division is as fast as amultiplication.
Your mission is to write a program to findthe least number of operations to compute xn bymultiplication and division starting with x for the givenpositive integer n. Products and quotients appearing in thesequence of operations should be x to a positive integer'spower. In other words, x-3, for example, should neverappear.
The input is a sequence of one or morelines each containing a single integer n. n ispositive and less than or equal to 1000. The end of the input is indicated by azero.
Your program should print the least totalnumber of multiplications and divisions required to compute xn startingwith x for the integer n. The numbers should bewritten each in a separate line without any superfluous characters such asleading or trailing spaces.
1
31
70
91
473
512
811
953
0
0
6
8
9
11
9
13
12
代码:
// UVa1374 Power Calculus |
// Rujia Liu |
#include<cstdio> |
#include<cstring> |
#include<algorithm> |
using namespace std; |
const int maxans = 13; // we got it by experimenting |
int n, a[maxans+1]; |
bool dfs(int d, int maxd) { |
if(a[d] == n) return true; |
if(d == maxd) return false; |
int maxv = a[0]; |
for(int i = 1; i <= d; i++) maxv = max(maxv, a[i]); |
if((maxv << (maxd-d)) < n) return false; |
// Always use the last value. |
// I can't prove it, but we haven't found a counter-example for n <= 1000 |
for(int i = d; i >= 0; i--) { |
a[d+1] = a[d] + a[i]; |
if(dfs(d+1, maxd)) return true; |
a[d+1] = a[d] - a[i]; |
if(dfs(d+1, maxd)) return true; |
} |
return false; |
} |
int solve(int n) { |
if(n == 1) return 0; |
a[0] = 1; |
for(int maxd = 1; maxd < maxans; maxd++) { |
if(dfs(0, maxd)) return maxd; |
} |
return maxans; |
} |
int main() { |
while(scanf("%d", &n) == 1 && n) { |
printf("%d\n", solve(n)); |
} |
return 0; |
} |
�#< �/QpSNormal>{
int T;
scanf("%d", &T);
while(T--)
{
scanf("%lf%d", &r, &n);
for(int i = 0; i < n; i++) scanf("%lf", &w[i]);
for(int i = 0; i < (1<<n); i++)
{
sum[i] = 0;
tree[i].clear();
for(int j = 0; j < n; j++)
if(i & (1<<j)) sum[i]+= w[j];
}
int root = (1<<n)-1;
memset(vis, 0, sizeof(vis));
dfs(root);
double ans = -1;
for(int i = 0; i < tree[root].size(); i++)
ans = max(ans, tree[root][i].L + tree[root][i].R);
printf("%.10lf\n", ans);
}
return 0;
}