一、问题描述
二、问题分析
总的来说就是穷举法计算每一种可能的排列的总电阻,然后如何列举每一种排列并计算就是解题的重点,有两种方法,一种是递归法,另一种是递推法(如C/C++实现和Python实现)。
三、代码实现
1.C/C++实现
#include <string>
#include <sstream>
#include <algorithm>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cctype>
using namespace std;
const int N = 10; // 电阻数目
const double VALUE = 1.0; // 每个电阻值
const double TARGET = 1.6180339887; // 需要逼近的目标值
const int SIZE = 1 << (N - 1);
double sum[SIZE];
int main()
{
sum[0] = VALUE;
for (int i = 2; i <= 10; i++)
{
int tmp = 1 << (10 - i);
for (int j = SIZE - tmp; j >= 0; j -= (tmp << 1))
{
// 计算并保持并联电阻
sum[j] = 1 / (1 / sum[j - tmp] + 1 / VALUE);
// 计算并保持串联电阻
sum[j - tmp] += VALUE;
}
}
// 寻找误差最小的连接方式
int min_index = -1;
double min_err = N * VALUE;
for (int i = 0; i < SIZE; i++)
{
// 计算当前连接方式的电阻与目标值误差
double err = fabs(TARGET - sum[i]);
if (err < min_err)
{
// 更新最小误差值
min_err = err;
min_index = i;
}
}
printf("%d\n%.10f\n", min_index, sum[min_index]);
return 0;
}
2.Python实现
# coding = utf-8
COUNT = 10
TARGET = 1.6180339887
VALUE = 1.0
values = [[] for i in range(10)]
def generate(count):
values[0].append(VALUE)
# 计算 i 个电阻的所有可能值
for i in range(1, 10):
# 根据 i - 1 个电阻的所有可能值计算
for value in values[i - 1]:
values[i].append(value + VALUE) # 串联
values[i].append(1 / (1 / value + 1 / VALUE)) # 并联
pass
if __name__ == '__main__':
generate(COUNT)
index = -1
min_err = COUNT * VALUE
for i, value in enumerate(values[COUNT - 1]):
err = abs(value - TARGET)
if min_err > err:
index = i
min_err = err
print(index, "{:.10f}".format(values[COUNT - 1][index]), min_err)
pass